摘要
CheckBoxList 控件是使用在项目复选的状态,我们可以使用一个整数值来描述复选项目,项目值以 2 的 N 次方来描述。例如
选项一 = 2^0 = 1
选项二 = 2^1 = 2
选项三 = 2^2 = 4
选项四 = 2^3 = 8
... 依此类推
当复选了「选项一」及「选项三」,则复选值为 1+4=5。当复选了「选项二」及「选项四」,则复选值为 2+8=10。若要使用上述的方式来描述复选项目,一般要自行撰写程序代码来处理。本文将扩展 CheckBoxList 控件,新增一个 FlagValue 属性,直接可以双向系结这个复选值。
扩展 CheckBoxList 控件
继承 CheckBoxList 命名为 TBCheckBoxList,新增一个 FlagValue 属性。当取得 FlagValue 值时,会使用 GetFlagValue 方法取的复选的项目对应的值,当设定 FlagValue 值时,会使用 SetFlagValue 方法将值反应至复选项目。
测试程序
在页面上放置 TBCheckBoxList 控件,我们只要使用 FlagValue 属性值,就可以轻易的取得或设定复选值。

如果 TBCheckBoxList.FlagValue 需要系结字段时,只需直接设定即可

CheckBoxList 控件是使用在项目复选的状态,我们可以使用一个整数值来描述复选项目,项目值以 2 的 N 次方来描述。例如
选项一 = 2^0 = 1
选项二 = 2^1 = 2
选项三 = 2^2 = 4
选项四 = 2^3 = 8
... 依此类推
当复选了「选项一」及「选项三」,则复选值为 1+4=5。当复选了「选项二」及「选项四」,则复选值为 2+8=10。若要使用上述的方式来描述复选项目,一般要自行撰写程序代码来处理。本文将扩展 CheckBoxList 控件,新增一个 FlagValue 属性,直接可以双向系结这个复选值。
扩展 CheckBoxList 控件
继承 CheckBoxList 命名为 TBCheckBoxList,新增一个 FlagValue 属性。当取得 FlagValue 值时,会使用 GetFlagValue 方法取的复选的项目对应的值,当设定 FlagValue 值时,会使用 SetFlagValue 方法将值反应至复选项目。
1
Imports System.Web.UI.WebControls
2
Imports System.ComponentModel
3
4
Namespace WebControls
5
Public Class TBCheckBoxList
6
Inherits CheckBoxList
7
8
''' <summary>
9
''' 项目复选的 Flag 值。
10
''' </summary>
11
<Bindable(True)> _
12
Public Property FlagValue() As Integer
13
Get
14
Return GetFlagValue()
15
End Get
16
Set(ByVal value As Integer)
17
SetFlagValue(value)
18
End Set
19
End Property
20
21
''' <summary>
22
''' 取得 Flag 值。
23
''' </summary>
24
Private Function GetFlagValue() As Integer
25
Dim iFlagValue As Integer
26
Dim iValue As Integer
27
Dim oItem As ListItem
28
Dim N1 As Integer
29
30
iFlagValue = 0
31
For N1 = 0 To Me.Items.Count - 1
32
oItem = Me.Items(N1)
33
If oItem.Selected Then
34
iValue = CInt(2 ^ N1) '2 的 N 次方
35
iFlagValue = iFlagValue + iValue
36
End If
37
Next
38
Return iFlagValue
39
End Function
40
41
''' <summary>
42
''' 设定 Flag 值。
43
''' </summary>
44
''' <param name="Value">Flag 值。</param>
45
Private Sub SetFlagValue(ByVal Value As Integer)
46
Dim iFlagValue As Integer
47
Dim iBase As Integer
48
Dim iValue As Integer
49
50
Me.ClearSelection()
51
iFlagValue = Value
52
iBase = 0
53
While iBase <= iFlagValue
54
iValue = CInt(2 ^ iBase) '2 的 N 次方
55
If (iFlagValue And iValue) = iValue Then
56
Me.Items(iBase).Selected = True
57
iFlagValue = iFlagValue - iValue
58
End If
59
iBase = iBase + 1
60
End While
61
End Sub
62
63
End Class
64
End Namespace

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

测试程序
在页面上放置 TBCheckBoxList 控件,我们只要使用 FlagValue 属性值,就可以轻易的取得或设定复选值。

1
Protected Sub btnGetFlagValue_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGetFlagValue.Click
2
txtValue.Text = CheckBoxList1.FlagValue.ToString
3
End Sub
4
5
Protected Sub btnSetFlagValue_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSetFlagValue.Click
6
CheckBoxList1.FlagValue = CInt(txtValue.Text)
7
End Sub

2

3

4

5

6

7

如果 TBCheckBoxList.FlagValue 需要系结字段时,只需直接设定即可
