根据输入内容,更改ListBox(System.Windows.Forms.ListBox)项显示内容
在做项目时,涉及到用户自定义报表,即用户可以根据自己的喜好,选择报表中需要显示的列,并可以对这些列重新命名/排序等.这些功能由报表设计器来完成.
最初设想的是使用ListBox的SelectedIndexChanged事件,根据此事件,显示TextBox中的文本内容,并根据用户输入的新的文本内容,再次更改当前的SelectedItem的内容.不过,当更改SelectedItem时,又触发了SeletecIndexChanged事件.因此,此方法不可行.
后来使用ListBox的Click事件来完成.
本文章中,只是对于方法的简单介绍.因此其中的数据比较简单,且不完整.
首先定义数据列模型,它包含列默认名称/用户自定义名称/列类型/与数据匹配的字段名等.
代码如下:
1: /// <summary>
2: /// 数据列类型
3: /// </summary>
4: public class DataColumn
5: {
6: /// <summary>
7: /// 默认列名
8: /// </summary>
9: public string DefaultName;
10:
11: /// <summary>
12: /// 用户自定义列名
13: /// </summary>
14: private string customName;
15:
16: /// <summary>
17: /// 此处需要提供CustomName属性,否则绑定时,DispalyMember无法正常显示.
18: /// (如果没有此属性,则绑定后显示为:LBTest.DataColumn)
19: /// </summary>
20: public string CustomName {
21: get { return customName; }
22: set { this.customName = value;}
23: }
24:
25: /// <summary>
26: /// 列的数据类型
27: /// </summary>
28: public string DataType;
29:
30: /// <summary>
31: /// 字段名称
32: /// </summary>
33: public string FieldName;
34:
35: #region 构造函数
36: public DataColumn()
37: {
38: this.DefaultName = "默认列名";
39: this.customName = "用户自定义列名";
40: this.DataType = "System.String";
41: this.FieldName = string.Empty;
42: }
43:
44: public DataColumn(string defaultName,string customName,string dataType,string fieldName)
45: {
46: this.DefaultName = defaultName;
47: this.customName = customName;
48: this.DataType = dataType;
49: this.FieldName = fieldName;
50: }
51: #endregion 构造函数
52: }
我们在窗体装载时,向ListBox上绑定数据.
1: /// <summary>
2: /// 绑定数据源
3: /// </summary>
4: private void InitBindData()
5: {
6: DataColumn dc = new DataColumn("用户名","用户登录名称","System.String","userName");
7: this.lbColumn.Items.Add(dc);
8: dc = new DataColumn("地址","家庭住址","System.String","address");
9: this.lbColumn.Items.Add(dc);
10: dc = new DataColumn("电话","电话","System.String","tel");
11: this.lbColumn.Items.Add(dc);
12:
13: //此处设置要显示的属性成员名称,注意,此处要使用属性不能使用字段,否则无法显示
14: this.lbColumn.DisplayMember = "CustomName";
15: }
之后实现ListBox双击事件,和用户更改客户端列名称显示方法
1: /// <summary>
2: /// 列表框双击事件
3: /// </summary>
4: void LbColumnClick(object sender, System.EventArgs e)
5: {
6: if(this.lbColumn.SelectedIndex > -1)
7: {
8: DataColumn dc = (DataColumn)this.lbColumn.SelectedItem;
9: this.txtCustom.Text = dc.CustomName;
10: }
11: }
12:
13: /// <summary>
14: /// 用户输入新的客户端名称
15: /// </summary>
16: void TxtCustomTextChanged(object sender, System.EventArgs e)
17: {
18: if(this.lbColumn.SelectedIndex > -1)
19: {
20: DataColumn dc = (DataColumn)this.lbColumn.SelectedItem;
21: dc.CustomName = this.txtCustom.Text.Trim();
22: this.lbColumn.Items[this.lbColumn.SelectedIndex] = dc;
23: }
24: }
最终效果如下图所示.
如注意的地方:
1.使用Click事件代替SeletecIndexChanged事件.
2.数据源定义中要声明属性的实现(关于这个,还要仔细研究.)
---------------------------------------------