现在的位置: 首页 > 综合 > 正文

根据输入内容,更改ListBox(System.Windows.Forms.ListBox)项显示内容

2012年12月29日 ⁄ 综合 ⁄ 共 2704字 ⁄ 字号 评论关闭

在做项目时,涉及到用户自定义报表,即用户可以根据自己的喜好,选择报表中需要显示的列,并可以对这些列重新命名/排序等.这些功能由报表设计器来完成.

最初设想的是使用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:         }

最终效果如下图所示.

lbTest

如注意的地方:

1.使用Click事件代替SeletecIndexChanged事件.

2.数据源定义中要声明属性的实现(关于这个,还要仔细研究.)

Richie-Chen 标签:

抱歉!评论已关闭.