![]() |
#2
jianjunfeng2015-02-10 14:12
回复 楼主 single_yu
Public Class Form1
Public WithEvents txtEdit As New TextBox Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.ListBox1.Items.Add("aa") Me.ListBox1.Items.Add("bb") Me.ListBox1.Items.Add("cc") Me.ListBox1.Items.Add("dd") Me.ListBox1.DrawMode = DrawMode.OwnerDrawFixed Me.ListBox1.ItemHeight = 25 AddHandler txtEdit.KeyDown, AddressOf txtEdit_KeyDown End Sub Private Sub ListBox1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.DoubleClick Dim itemSelected As Integer = ListBox1.SelectedIndex Dim itemText As String = ListBox1.Items(Me.ListBox1.SelectedIndex).ToString Dim rect As Rectangle = ListBox1.GetItemRectangle(itemSelected) txtEdit.Parent = ListBox1 txtEdit.Bounds = rect txtEdit.Multiline = True txtEdit.Visible = True txtEdit.Text = itemText txtEdit.Focus() txtEdit.SelectAll() End Sub Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem e.DrawBackground() e.DrawFocusRectangle() e.Graphics.DrawString(Me.ListBox1.Items(e.Index).ToString, e.Font, New SolidBrush(e.ForeColor), e.Bounds) End Sub Private Sub ListBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseClick txtEdit.Visible = False End Sub Private Sub txtEdit_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtEdit.KeyDown ' //Enter键 更新项并隐藏编辑框 If e.KeyCode = Keys.Enter Then ListBox1.Items(ListBox1.SelectedIndex) = txtEdit.Text txtEdit.Visible = False End If ' //Esc键 直接隐藏编辑框 If e.KeyCode = Keys.Escape Then txtEdit.Visible = False End If End Sub End Class [ 本帖最后由 jianjunfeng 于 2015-2-10 19:25 编辑 ] |
只有本站会员才能查看附件,请 登录
下面把C#代码贴上来
正常情况下,.Net自带的ListBox是无法进行编辑的,欲让它可编辑,我们可添加一个隐藏的文本编辑框,当双击项的时候显示编辑框,更新项内容后隐藏编辑框即可。
欲调整ListBox每个项的高度,ListBox有一个自带属性ItemHeight,于是我们很自然的就设这个属性值,结果却发现改不动,改后又返回默认值12,后面才发现要使该属性值有效更改,必须将DrawMode属性设为OwnerDrawFixed,并且为ListBox添加DrawItem事件:

private void listBox1_DrawItem( object sender , DrawItemEventArgs e )
{
e.DrawBackground( );
e.DrawFocusRectangle( );
e.Graphics.DrawString( listBox1.Items[e.Index].ToString( ) , e.Font , new SolidBrush( e.ForeColor ) , e.Bounds );
}
{
e.DrawBackground( );
e.DrawFocusRectangle( );
e.Graphics.DrawString( listBox1.Items[e.Index].ToString( ) , e.Font , new SolidBrush( e.ForeColor ) , e.Bounds );
}
经过这样的控制后,设计界面中的ListBox项看不到了,但没关系,运行的时候是可见的,而且每个项的高度确实作了有效更改。
接下来我们为ListBox再添几个事件来控制编辑框的显示,其实就两个:DoubleClick和MouseClick。好了,在添加之前我们在全局区定义一个编辑框txtEdit,并在构造函数为其添加KeyDown事件:

TextBox txtEdit = new TextBox( );
/// <summary>
/// 构造函数
/// </summary>
public Form1()
{
InitializeComponent();
txtEdit.KeyDown += new KeyEventHandler( txtEdit_KeyDown );
}
/// <summary>
/// KeyDown事件定义
/// </summary>
private void txtEdit_KeyDown( object sender , KeyEventArgs e )
{
//Enter键 更新项并隐藏编辑框
if ( e.KeyCode == Keys.Enter )
{
listBox1.Items[listBox1.SelectedIndex] = txtEdit.Text;
txtEdit.Visible = false;
}
//Esc键 直接隐藏编辑框
if ( e.KeyCode == Keys.Escape )
txtEdit.Visible = false;
}
/// <summary>
/// 双击项时显示编辑框
/// </summary>
private void listBox1_DoubleClick( object sender , EventArgs e )
{
int itemSelected = listBox1.SelectedIndex;
string itemText = listBox1.Items[itemSelected].ToString( );
Rectangle rect = listBox1.GetItemRectangle( itemSelected );
txtEdit.Parent = listBox1;
txtEdit.Bounds = rect;
txtEdit.Multiline = true;
txtEdit.Visible = true;
txtEdit.Text = itemText;
txtEdit.Focus( );
txtEdit.SelectAll( );
}
/// <summary>
/// 点击其它项 隐藏编辑框
/// </summary>
private void listBox1_MouseClick( object sender , MouseEventArgs e )
{
txtEdit.Visible = false;
}
/// <summary>
/// 构造函数
/// </summary>
public Form1()
{
InitializeComponent();
txtEdit.KeyDown += new KeyEventHandler( txtEdit_KeyDown );
}
/// <summary>
/// KeyDown事件定义
/// </summary>
private void txtEdit_KeyDown( object sender , KeyEventArgs e )
{
//Enter键 更新项并隐藏编辑框
if ( e.KeyCode == Keys.Enter )
{
listBox1.Items[listBox1.SelectedIndex] = txtEdit.Text;
txtEdit.Visible = false;
}
//Esc键 直接隐藏编辑框
if ( e.KeyCode == Keys.Escape )
txtEdit.Visible = false;
}
/// <summary>
/// 双击项时显示编辑框
/// </summary>
private void listBox1_DoubleClick( object sender , EventArgs e )
{
int itemSelected = listBox1.SelectedIndex;
string itemText = listBox1.Items[itemSelected].ToString( );
Rectangle rect = listBox1.GetItemRectangle( itemSelected );
txtEdit.Parent = listBox1;
txtEdit.Bounds = rect;
txtEdit.Multiline = true;
txtEdit.Visible = true;
txtEdit.Text = itemText;
txtEdit.Focus( );
txtEdit.SelectAll( );
}
/// <summary>
/// 点击其它项 隐藏编辑框
/// </summary>
private void listBox1_MouseClick( object sender , MouseEventArgs e )
{
txtEdit.Visible = false;
}
只有本站会员才能查看附件,请 登录
[ 本帖最后由 single_yu 于 2015-2-5 01:00 编辑 ]