可编辑的ListBox,是C#写的,谁帮我看看,怎么改一下,谢谢!
看到一个帖子,我正好用到,但是不会C#,不知道怎么搞,谁帮我看一下,用怎么操作,我写了一个自定义控件,继承ListBox,但是没有实现最后一步,如果字体变大的话,就会被遮住了,选项宽度不会变!下面把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 ); }
经过这样的控制后,设计界面中的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; }
[ 本帖最后由 single_yu 于 2015-2-5 01:00 编辑 ]