摘要
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 方法将值反应至复选项目。
1Imports System.Web.UI.WebControls
2Imports System.ComponentModel
3
4Namespace 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
64End Namespace
2Imports System.ComponentModel
3
4Namespace 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
64End Namespace
测试程序
在页面上放置 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 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
如果 TBCheckBoxList.FlagValue 需要系结字段时,只需直接设定即可