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

 
   
 
   
虽然同在.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的单选呢,这里需要用程序去实现,如下:

        /// 
        /// 单选
        /// 
        /// 
        /// 
        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);
                    }
                }
            }
        }

        /// 
        /// 内部用户类,用于加载checkedListBox控件,以及返回对象
        /// 
        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());
            }
        }




      

你可能感兴趣的:(CheckListBox)