WinForm之CheckListBox:绑定、取值与单选

来源:互联网 发布:卡雷尔机器人编程 编辑:程序博客网 时间:2024/06/05 07:07

虽然同在.NET框架这个屋檐下,但WinForm与WebForm有些控件的成员和方法还是有不同的。习惯了WebForm的使用,在WinForm中还是有些不习惯。

比如说CheckListBox的数据绑定问题,找了很久,终于综合各路方法,得到以下结论:
1、如何绑定与取值。可以使用clb.DataSource,然后设置DisplayMember和ValueMember;但这种方法绑定之后,显示是正常的,而取值(Value)的时候,我却找不到方法了。因为很常时候,我们需要的是给用户看是一种方式,内部值(比如ID等)又是另一种方式。得到显示值可用方法:clb.GetItemText(),但得到内部值的方法没有得到。
所以,我们得换一种绑定的方法,绑定方法确定了取值的方法。这里,运用笨方法能够取得应有的效果:
就是循环遍历数据集,然后转化为你想要的对象(可以暂时定义一个内部对象,要注意一定要重载ToString()方法),加入clb.Items集合。这样,就实现了绑定。一个简单的例子如下(外部类省略):
      
…………
在需要绑定数据的时候,做如下处理:
                   
 foreach (DataRow dr in dt.Rows)//dt为数据源:DataTable类型                    {                        this.clbUsers.Items.Add(new InnerUser(dr));                    }


在取值的时候,就方便了,如下:
               
            InnerUser uChecked = (InnerUser)(this.clbUsers.CheckedItems[0]);//这里我做的是单选,所以索引为0                this.selUserName = uChecked.GetUserName();                this.selUserID = uChecked.GetUserID();


问题解决。下面说一下单选问题。
2、如何只允许单选。CheckListBox有一个叫SelectionMode的属性,如果设置为SelectionMode.One,并没有取得单选的效果。这里要说明一下,就是CheckListBox的单选,并不代表单项的CheckBox的单选。所以,这里没有取得预期的效果。
如何取得单项CheckBox的单选呢,这里需要用程序去实现,如下:

        /// <summary>        /// 单选        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void clbUsers_ItemCheck(object sender, ItemCheckEventArgs e)        {            if (clbUsers.CheckedItems.Count > 0)            {                for (int i = 0; i < clbUsers.Items.Count; i++)                {                    if (i != e.Index)                    {                        this.clbUsers.SetItemCheckState(i, System.Windows.Forms.CheckState.Unchecked);                    }                }            }        }        /// <summary>        /// 内部用户类,用于加载checkedListBox控件,以及返回对象        /// </summary>        class InnerUser        {            private DataRow dr;            public InnerUser(DataRow dr)            {                this.dr = dr;            }            public override string ToString()//一定要注意重载            {                return dr["UserName"].ToString();            }            public string GetUserName()            {                return this.ToString();            }            public Decimal GetUserID()            {                return Decimal.Parse(dr["UserID"].ToString());            }        }