改进的CheckedListBox控件
这个话题似乎很早就有说了,
不过我也最近才经常接触的winform。记录之
我希望能够在CheckedListBox中实现如下的效果:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 1 Category.CategorysDataTable dt; dt = new Category.CategorysDataTable();
2 2 dt.Constraints.Add(new UniqueConstraint(dt.IDColumn));
3 3 dt.Constraints.Add(new UniqueConstraint(dt.TableNameColumn));
4 4 Category.CategorysRow row = dt.NewCategorysRow();
5 5 row.ID = 1;
6 6 row.OrginialSequence = 1;
7 7 row.TargetSequence = 1;
8 8 row.TableName = "TB";
9 9 row.Flag = true;
1010 dt.AddCategorysRow(row);
1111
1212 row = dt.NewCategorysRow();
1313 row.ID = 2;
1414 row.OrginialSequence = 1;
1515 row.TargetSequence = 1;
1616 row.TableName = "TB2";
1717 row.Flag = false;
1818 dt.AddCategorysRow(row);
19 this.chklstbxTables.Items.Clear();
20 this.chklstbxTables.DataSource = dt;
21 this.chklstbxTables.DisplayMember = "TableName";
22 this.chklstbxTables.ValueMember= "Flag";
通过它,可以将CheckedListBox的复选框绑定到一个数据库的boolean型的字段上,效果如下
下面是我改造的过程
首先查了一下msdn,
http://msdn2.microsoft.com/zh-cn/library/system.windows.forms.checkedlistbox_members(VS.80).aspx
会看到如下几个属性,
但是这三个属性是我们需要的,
使用Reflector查看了一CheckedListBox的关系
在CheckedListBox中本身已经实现了这三个属性,仅是ms使用了如下的特性,使我们不能用它了,[EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]
知道了来龙去脉就好改造了,在原CheckedListBox基础上再扩展一个类ExCheckedListBox
不过我也最近才经常接触的winform。记录之
我希望能够在CheckedListBox中实现如下的效果:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 1 Category.CategorysDataTable dt; dt = new Category.CategorysDataTable();
2 2 dt.Constraints.Add(new UniqueConstraint(dt.IDColumn));
3 3 dt.Constraints.Add(new UniqueConstraint(dt.TableNameColumn));
4 4 Category.CategorysRow row = dt.NewCategorysRow();
5 5 row.ID = 1;
6 6 row.OrginialSequence = 1;
7 7 row.TargetSequence = 1;
8 8 row.TableName = "TB";
9 9 row.Flag = true;
1010 dt.AddCategorysRow(row);
1111
1212 row = dt.NewCategorysRow();
1313 row.ID = 2;
1414 row.OrginialSequence = 1;
1515 row.TargetSequence = 1;
1616 row.TableName = "TB2";
1717 row.Flag = false;
1818 dt.AddCategorysRow(row);
19 this.chklstbxTables.Items.Clear();
20 this.chklstbxTables.DataSource = dt;
21 this.chklstbxTables.DisplayMember = "TableName";
22 this.chklstbxTables.ValueMember= "Flag";
下面是我改造的过程
首先查了一下msdn,
http://msdn2.microsoft.com/zh-cn/library/system.windows.forms.checkedlistbox_members(VS.80).aspx
会看到如下几个属性,
DataSource | 获取或设置控件的数据源。此属性与此类无关。 |
DisplayMember | 此属性与此类无关。 |
ValueMember | 获取或设置一个字符串,该字符串指定要从中取值的数据源的属性此属性与此类无关。 |
使用Reflector查看了一CheckedListBox的关系
在CheckedListBox中本身已经实现了这三个属性,仅是ms使用了如下的特性,使我们不能用它了,[EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]
知道了来龙去脉就好改造了,在原CheckedListBox基础上再扩展一个类ExCheckedListBox
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.ComponentModel;
5using System.Drawing;
6using System.Windows.Forms;
7using System.Drawing.Design;
8
9namespace CustomControls
10{
11 /**//// <summary>
12 /// (eraghi)
13 /// Extended CheckedListBox with binding facilities (Value property)
14 /// </summary>
15 [ToolboxBitmap(typeof(CheckedListBox))]
16 public class ExCheckedListBox : CheckedListBox
17 {
18 /**//// <summary>
19 /// Default constructor
20 /// </summary>
21 public ExCheckedListBox()
22 {
23 this.CheckOnClick = true;
24
25 }
26
27
28
29 /**//// <summary>
30 /// Gets or sets the property to display for this CustomControls.CheckedListBox.
31 ///
32 /// Returns:
33 /// A System.String specifying the name of an object property that is contained
34 /// in the collection specified by the CustomControls.CheckedListBox.DataSource
35 /// property. The default is an empty string ("").
36 /// </summary>
37 [DefaultValue("")]
38 [TypeConverter("System.Windows.Forms.Design.DataMemberFieldConverter, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
39 [Editor("System.Windows.Forms.Design.DataMemberFieldEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
40 [Browsable(true)]
41 public new string DisplayMember
42 {
43 get
44 {
45 return base.DisplayMember;
46 }
47 set
48 {
49 base.DisplayMember = value;
50
51 }
52 }
53
54 /**//// <summary>
55 /// Gets or sets the data source for this CustomControls.CheckedListBox.
56 /// Returns:
57 /// An object that implements the System.Collections.IList or System.ComponentModel.IListSource
58 /// interfaces, such as a System.Data.DataSet or an System.Array. The default
59 /// is null.
60 ///
61 ///Exceptions:
62 /// System.ArgumentException:
63 /// The assigned value does not implement the System.Collections.IList or System.ComponentModel.IListSource
64 /// interfaces.
65 /// </summary>
66 [DefaultValue("")]
67 [AttributeProvider(typeof(IListSource))]
68 [RefreshProperties(RefreshProperties.All)]
69 [Browsable(true)]
70 public new object DataSource {
71 get
72 {
73 return base.DataSource;
74 }
75 set
76 {
77 base.DataSource = value;
78
79 }
80 }
81 private int value;
82 [DefaultValue(""), TypeConverter("System.Windows.Forms.Design.DataMemberFieldConverter, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), Editor("System.Windows.Forms.Design.DataMemberFieldEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
83 [Browsable(true)]
84 public new string ValueMember
85 {
86 get
87 {
88 /**////Gets checked items in decimal mode from binary mode
89
90 try
91 {
92 //each item in list has a number that is binary number in decimal mode
93 //this number represents that number
94 int poweredNumber = 1;
95 //loop in all items of list
96 for (int i = 0; i < this.Items.Count; i++)
97 {
98 //if item checked and the value doesn't contains poweredNumber then
99 //add poweredNumber to the value
100 if ((this.GetItemChecked(i)))
101 this.value |= poweredNumber;
102 //else if poweredNumber exists in the value remove from it
103 else if ((this.value & poweredNumber) != 0)
104 this.value -= poweredNumber;
105
106 //raise to the power
107 poweredNumber *= 2;
108 }
109 }
110 catch (ArgumentException ex)
111 {
112 throw ex;
113 }
114 catch (Exception ex)
115 {
116 throw ex;
117 }
118
119
120 return base.ValueMember;
121 }
122 set
123 {
124 base.ValueMember = value;
125 if (base.ValueMember.ToLower() == "false")
126 this.value = 0;
127 else
128 this.value
2using System.Collections.Generic;
3using System.Text;
4using System.ComponentModel;
5using System.Drawing;
6using System.Windows.Forms;
7using System.Drawing.Design;
8
9namespace CustomControls
10{
11 /**//// <summary>
12 /// (eraghi)
13 /// Extended CheckedListBox with binding facilities (Value property)
14 /// </summary>
15 [ToolboxBitmap(typeof(CheckedListBox))]
16 public class ExCheckedListBox : CheckedListBox
17 {
18 /**//// <summary>
19 /// Default constructor
20 /// </summary>
21 public ExCheckedListBox()
22 {
23 this.CheckOnClick = true;
24
25 }
26
27
28
29 /**//// <summary>
30 /// Gets or sets the property to display for this CustomControls.CheckedListBox.
31 ///
32 /// Returns:
33 /// A System.String specifying the name of an object property that is contained
34 /// in the collection specified by the CustomControls.CheckedListBox.DataSource
35 /// property. The default is an empty string ("").
36 /// </summary>
37 [DefaultValue("")]
38 [TypeConverter("System.Windows.Forms.Design.DataMemberFieldConverter, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
39 [Editor("System.Windows.Forms.Design.DataMemberFieldEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
40 [Browsable(true)]
41 public new string DisplayMember
42 {
43 get
44 {
45 return base.DisplayMember;
46 }
47 set
48 {
49 base.DisplayMember = value;
50
51 }
52 }
53
54 /**//// <summary>
55 /// Gets or sets the data source for this CustomControls.CheckedListBox.
56 /// Returns:
57 /// An object that implements the System.Collections.IList or System.ComponentModel.IListSource
58 /// interfaces, such as a System.Data.DataSet or an System.Array. The default
59 /// is null.
60 ///
61 ///Exceptions:
62 /// System.ArgumentException:
63 /// The assigned value does not implement the System.Collections.IList or System.ComponentModel.IListSource
64 /// interfaces.
65 /// </summary>
66 [DefaultValue("")]
67 [AttributeProvider(typeof(IListSource))]
68 [RefreshProperties(RefreshProperties.All)]
69 [Browsable(true)]
70 public new object DataSource {
71 get
72 {
73 return base.DataSource;
74 }
75 set
76 {
77 base.DataSource = value;
78
79 }
80 }
81 private int value;
82 [DefaultValue(""), TypeConverter("System.Windows.Forms.Design.DataMemberFieldConverter, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), Editor("System.Windows.Forms.Design.DataMemberFieldEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
83 [Browsable(true)]
84 public new string ValueMember
85 {
86 get
87 {
88 /**////Gets checked items in decimal mode from binary mode
89
90 try
91 {
92 //each item in list has a number that is binary number in decimal mode
93 //this number represents that number
94 int poweredNumber = 1;
95 //loop in all items of list
96 for (int i = 0; i < this.Items.Count; i++)
97 {
98 //if item checked and the value doesn't contains poweredNumber then
99 //add poweredNumber to the value
100 if ((this.GetItemChecked(i)))
101 this.value |= poweredNumber;
102 //else if poweredNumber exists in the value remove from it
103 else if ((this.value & poweredNumber) != 0)
104 this.value -= poweredNumber;
105
106 //raise to the power
107 poweredNumber *= 2;
108 }
109 }
110 catch (ArgumentException ex)
111 {
112 throw ex;
113 }
114 catch (Exception ex)
115 {
116 throw ex;
117 }
118
119
120 return base.ValueMember;
121 }
122 set
123 {
124 base.ValueMember = value;
125 if (base.ValueMember.ToLower() == "false")
126 this.value = 0;
127 else
128 this.value