在DataGridView中TextBox和ComboBox混合编辑

假期帮同学做了一个信息管理系统,里面涉及到一些枚举类型的数据和文字类型的数据的混合编辑。
数据列表和编辑,我第一个想到的就是DataGridView。但是DataGridView只能实现列的编辑类型设置,不能针对一个CELL进行设置。
琢磨了很久,发现了下面的解决方法:
主要思路就是在编辑控件现实的时候,在父控件中加入一个COMBOBOX,用来进行枚举数据的编辑。把它放到最前,挡住文本框,并把文本框的值给它。当COMBOBOX的内容改变时,更新到文本框中。文本框隐藏时,删除这个COMBOBOX。
代码如下:

ContractedBlock.gif ExpandedBlockStart.gif Code
 1         private void gvInfo_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
 2         {
 3             //  检查选中的CELL
 4             if (gvInfo.SelectedCells.Count > 0)
 5             {
 6                 //  取得选中的CELL的行索引
 7                 int nRowIndex = gvInfo.SelectedCells[0].RowIndex;
 8                 //  取得本行的数据定义
 9                 dataDefineItem item = myInfo.DataDefine.Items[nRowIndex];
10                 //  如果数据是枚举类型的
11                 if (item.EditType == DataEditType.ENUM)
12                 {
13                     //  获取编辑控件
14                     TextBox tb = (TextBox)e.Control;
15                     //  创建枚举选择用的COMBOBOX
16                     ComboBox cb = new ComboBox();
17                     //  把COMBOBOX加入到文本控件的父控件中
18                     tb.Parent.Controls.Add(cb);
19                     //  保存实例到文本控件的TAG中
20                     tb.Tag = cb;
21                     //  监听文本控件的可视状态变化
22                     tb.VisibleChanged += new System.EventHandler(tb_VisibleChanged);
23                     cb.Left = 0;
24                     cb.Top = 0;
25                     //  填充整个CELL
26                     cb.Dock = DockStyle.Fill;
27                     //  添加枚举字符串
28                     foreach (string sval in item.Params)
29                         cb.Items.Add(sval);
30                     //  设置为下拉表风格
31                     cb.DropDownStyle = ComboBoxStyle.DropDownList;
32                     //  设置文本为TEXTBOX的文本,也就是数据的值
33                     cb.Text = tb.Text;
34                     //  保存文本框的实例引用,以便于设置文本框值
35                     cb.Tag = tb;
36                     //  切换到前面
37                     cb.BringToFront();
38                     //  监听文本和选择改变的事件,以便于设置文本编辑框的值
39                     cb.TextChanged += new System.EventHandler(cb_TextChanged);
40                     cb.SelectedIndexChanged += new System.EventHandler(cb_SelectedIndexChanged);
41                 }
42             }
43         }
44         //  文本框消失时删除COMBOBOX 
45         void tb_VisibleChanged(object sender, EventArgs e)
46         {
47             TextBox tb = (TextBox)sender;
48             if (tb.Visible == false &&
49                 tb.Tag != null)
50             {
51                 ComboBox cb = (ComboBox)tb.Tag;
52                 tb.Tag = null;
53                 cb.Tag = null;
54                 tb.Parent.Controls.Remove(cb);
55                 cb.Dispose();
56             }
57         }
58         //  内容改变时,更新到文本框
59         void cb_SelectedIndexChanged(object sender, EventArgs e)
60         {
61             ComboBox cb = (ComboBox)sender;
62             TextBox tb = (TextBox)cb.Tag;
63             tb.Text = cb.Text;
64         }
65         //  内容改变时,更新到文本框
66         void cb_TextChanged(object sender, EventArgs e)
67         {
68             ComboBox cb = (ComboBox)sender;
69             TextBox tb = (TextBox)cb.Tag;
70             tb.Text = cb.Text;
71         }
72 
73 
74 
ContractedBlock.gif
 1         private void gvInfo_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
 2         {
 3             //  检查选中的CELL
 4             if (gvInfo.SelectedCells.Count > 0)
 5             {
 6                 //  取得选中的CELL的行索引
 7                 int nRowIndex = gvInfo.SelectedCells[0].RowIndex;
 8                 //  取得本行的数据定义
 9                 dataDefineItem item = myInfo.DataDefine.Items[nRowIndex];
10                 //  如果数据是枚举类型的
11                 if (item.EditType == DataEditType.ENUM)
12                 {
13                     //  获取编辑控件
14                     TextBox tb = (TextBox)e.Control;
15                     //  创建枚举选择用的COMBOBOX
16                     ComboBox cb = new ComboBox();
17                     //  把COMBOBOX加入到文本控件的父控件中
18                     tb.Parent.Controls.Add(cb);
19                     //  保存实例到文本控件的TAG中
20                     tb.Tag = cb;
21                     //  监听文本控件的可视状态变化
22                     tb.VisibleChanged += new System.EventHandler(tb_VisibleChanged);
23                     cb.Left = 0;
24                     cb.Top = 0;
25                     //  填充整个CELL
26                     cb.Dock = DockStyle.Fill;
27                     //  添加枚举字符串
28                     foreach (string sval in item.Params)
29                         cb.Items.Add(sval);
30                     //  设置为下拉表风格
31                     cb.DropDownStyle = ComboBoxStyle.DropDownList;
32                     //  设置文本为TEXTBOX的文本,也就是数据的值
33                     cb.Text = tb.Text;
34                     //  保存文本框的实例引用,以便于设置文本框值
35                     cb.Tag = tb;
36                     //  切换到前面
37                     cb.BringToFront();
38                     //  监听文本和选择改变的事件,以便于设置文本编辑框的值
39                     cb.TextChanged += new System.EventHandler(cb_TextChanged);
40                     cb.SelectedIndexChanged += new System.EventHandler(cb_SelectedIndexChanged);
41                 }
42             }
43         }
44         //  文本框消失时删除COMBOBOX 
45         void tb_VisibleChanged(object sender, EventArgs e)
46         {
47             TextBox tb = (TextBox)sender;
48             if (tb.Visible == false &&
49                 tb.Tag != null)
50             {
51                 ComboBox cb = (ComboBox)tb.Tag;
52                 tb.Tag = null;
53                 cb.Tag = null;
54                 tb.Parent.Controls.Remove(cb);
55                 cb.Dispose();
56             }
57         }
58         //  内容改变时,更新到文本框
59         void cb_SelectedIndexChanged(object sender, EventArgs e)
60         {
61             ComboBox cb = (ComboBox)sender;
62             TextBox tb = (TextBox)cb.Tag;
63             tb.Text = cb.Text;
64         }
65         //  内容改变时,更新到文本框
66         void cb_TextChanged(object sender, EventArgs e)
67         {
68             ComboBox cb = (ComboBox)sender;
69             TextBox tb = (TextBox)cb.Tag;
70             tb.Text = cb.Text;
71 

转载于:https://www.cnblogs.com/detective/archive/2009/10/08/DataGridView.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值