根据输入内容,更改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:         }

最终效果如下图所示.

lbTest

如注意的地方:

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

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

Richie-Chen 标签:
posted @ 2010-06-23 18:00  Ritchie(乞戈)  阅读(2795)  评论(0编辑  收藏  举报