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