C# WinForm控件ListBox点选可编辑(附源码)

源码下载:http://dotnet.5d6d.com/thread-471-1-1.html
正常情况下,.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事件:
全部代码如下:
using  System;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;
using  System.Linq;
using  System.Text;
using  System.Windows.Forms;

namespace  EditListBox
{
    
public   partial   class  Form1 : Form
    {
        TextBox txtEdit 
=   new  TextBox();
        
///   <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 ;
        }
        
public  Form1()
        {
            InitializeComponent();
            txtEdit.KeyDown 
+=   new  KeyEventHandler(txtEdit_KeyDown);
            SetListBox();
            BindListBox();
        }
        
// 设置ListBox,高度为20
         private   void  SetListBox()
        {
            listBox1.DrawMode 
=  DrawMode.OwnerDrawFixed;
            listBox1.ItemHeight 
=   20 ;
        }
        
// 绑定ListBox
         private   void  BindListBox()
        {
            ListItem li 
=   new  ListItem( " 0 " " 选项一 " );
            listBox1.Items.Add(li);
            li 
=   new  ListItem( " 1 " " 选项二 " );
            listBox1.Items.Add(li);
            li 
=   new  ListItem( " 2 " " 选项三 " );
            listBox1.Items.Add(li);
        }
        
///   <summary>
        
///  选择项类,用于ComboBox或者ListBox添加项
        
///   </summary>
         public   class  ListItem
        {
            
private   string  id  =   string .Empty;
            
private   string  name  =   string .Empty;
            
public  ListItem( string  sid,  string  sname)
            {
                id 
=  sid;
                name 
=  sname;
            }
            
public   override   string  ToString()
            {
                
return   this .name;
            }
            
public   string  ID
            {
                
get
                {
                    
return   this .id;
                }
                
set
                {
                    
this .id  =  value;
                }
            }
            
public   string  Name
            {
                
get
                {
                    
return   this .name;
                }
                
set
                {
                    
this .name  =  value;
                }
            }
        }

        
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);
        }

        
private   void  listBox1_MouseClick( object  sender, MouseEventArgs e)
        {
            txtEdit.Visible 
=   false ;
        }

        
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();
        }
    }
}
经过这样的处理后,我们看看最终的效果:

源码下载: http://dotnet.5d6d.com/thread-471-1-1.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值