这个话题似乎很早就有说了,
不过我也最近才经常接触的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;
10
10 dt.AddCategorysRow(row);
11
11
12
12 row = dt.NewCategorysRow();
13
13 row.ID = 2;
14
14 row.OrginialSequence = 1;
15
15 row.TargetSequence = 1;
16
16 row.TableName = "TB2";
17
17 row.Flag = false;
18
18 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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22


下面是我改造的过程
首先查了一下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
1
using
System;
2
using
System.Collections.Generic;
3
using
System.Text;
4
using
System.ComponentModel;
5
using
System.Drawing;
6
using
System.Windows.Forms;
7
using
System.Drawing.Design;
8
9
namespace
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

2

3

4

5

6

7

8

9

10



11


12

13

14

15

16

17



18


19

20

21

22



23

24

25

26

27

28

29


30

31

32

33

34

35

36

37

38

39

40

41

42



43

44



45

46

47

48



49

50

51

52

53

54


55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70



71

72



73

74

75

76



77

78

79

80

81

82

83

84

85



86

87



88


89

90

91



92

93

94

95

96

97



98

99

100

101

102

103

104

105

106

107

108

109

110

111



112

113

114

115



116

117

118

119

120

121

122

123



124

125

126

127

128
