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 WebControlsNamespace WebControls
5
Public Class TBCheckBoxListClass TBCheckBoxList
6
Inherits CheckBoxList
7
8
/**/''' <summary>
9
''' 项目复选的 Flag 值。
10
''' </summary>
11
<Bindable(True)> _
12
Public Property FlagValue()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()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()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()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()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 需要系结字段时,只需直接设定即可
