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