C# 让ListBox可编辑

来源:互联网 发布:perl语言编程 编辑:程序博客网 时间:2024/05/31 15:18
 

正常情况下,.Net自带的ListBox是无法进行编辑的,欲让它可编辑,我们可添加一个隐藏的文本编辑框,当双击项的时候显示编辑框,更新项内容后隐藏编辑框即可。
欲调整ListBox每个项的高度,ListBox有一个自带属性ItemHeight,于是我们很自然的就设这个属性值,结果却发现改不动,改后又返回默认值12,后面才发现要使该属性值有效更改,必须将DrawMode属性设为OwnerDrawFixed,并且为ListBox添加DrawItem事件:

view plaincopy to clipboardprint?
  1. private void listBox1_DrawItem( object sender , DrawItemEventArgs e )  
  2. {  
  3.     e.DrawBackground( );  
  4.     e.DrawFocusRectangle( );  
  5.     e.Graphics.DrawString( listBox1.Items[e.Index].ToString( ) , e.Font , new SolidBrush( e.ForeColor ) , e.Bounds );  
  6. }  

经过这样的控制后,设计界面中的ListBox项看不到了,但没关系,运行的时候是可见的,而且每个项的高度确实作了有效更改。
接下来我们为ListBox再添几个事件来控制编辑框的显示,其实就两个:DoubleClick和MouseClick。好了,在添加之前我们在全局区定义一个编辑框txtEdit,并在构造函数为其添加KeyDown事件:

view plaincopy to clipboardprint?
  1. TextBox txtEdit = new TextBox( );  
  2. /// <summary>   
  3. /// 构造函数   
  4. /// </summary>   
  5. public Form1()  
  6. {  
  7.     InitializeComponent();  
  8.     txtEdit.KeyDown += new KeyEventHandler( txtEdit_KeyDown );  
  9. }  
  10. /// <summary>   
  11. /// KeyDown事件定义   
  12. /// </summary>   
  13. private void txtEdit_KeyDown( object sender , KeyEventArgs e )  
  14. {  
  15.     //Enter键 更新项并隐藏编辑框   
  16.     if ( e.KeyCode == Keys.Enter )    
  17.     {  
  18.         listBox1.Items[listBox1.SelectedIndex] = txtEdit.Text;  
  19.         txtEdit.Visible = false;  
  20.     }  
  21.     //Esc键 直接隐藏编辑框   
  22.     if ( e.KeyCode == Keys.Escape )     
  23.         txtEdit.Visible = false;  
  24. }  
  25. /// <summary>   
  26. /// 双击项时显示编辑框   
  27. /// </summary>   
  28. private void listBox1_DoubleClick( object sender , EventArgs e )  
  29. {  
  30.     int itemSelected = listBox1.SelectedIndex;  
  31.     string itemText = listBox1.Items[itemSelected].ToString( );  
  32.   
  33.     Rectangle rect = listBox1.GetItemRectangle( itemSelected );  
  34.     txtEdit.Parent = listBox1;  
  35.     txtEdit.Bounds = rect;  
  36.     txtEdit.Multiline = true;  
  37.     txtEdit.Visible = true;  
  38.     txtEdit.Text = itemText;  
  39.     txtEdit.Focus( );  
  40.     txtEdit.SelectAll( );  
  41. }  
  42. /// <summary>   
  43. /// 点击其它项 隐藏编辑框   
  44. /// </summary>   
  45. private void listBox1_MouseClick( object sender , MouseEventArgs e )  
  46. {  
  47.     txtEdit.Visible = false;  
  48. }  

经过这样的处理后,我们看看最终的效果:

原创粉丝点击