擴展 CheckBoxList 控制項 - 繫結複選項目
摘要
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 方法將值反應至複選項目。
Imports System.Web.UI.WebControls
Imports System.ComponentModel
Namespace WebControls
Public Class TBCheckBoxList
Inherits CheckBoxList
''' <summary>
''' 項目複選的 Flag 值。
''' </summary>
<Bindable(True)> _
Public Property FlagValue() As Integer
Get
Return GetFlagValue()
End Get
Set(ByVal value As Integer)
SetFlagValue(value)
End Set
End Property
''' <summary>
''' 取得 Flag 值。
''' </summary>
Private Function GetFlagValue() As Integer
Dim iFlagValue As Integer
Dim iValue As Integer
Dim oItem As ListItem
Dim N1 As Integer
iFlagValue = 0
For N1 = 0 To Me.Items.Count - 1
oItem = Me.Items(N1)
If oItem.Selected Then
iValue = CInt(2 ^ N1) '2 的 N 次方
iFlagValue = iFlagValue + iValue
End If
Next
Return iFlagValue
End Function
''' <summary>
''' 設定 Flag 值。
''' </summary>
''' <param name="Value">Flag 值。</param>
Private Sub SetFlagValue(ByVal Value As Integer)
Dim iFlagValue As Integer
Dim iBase As Integer
Dim iValue As Integer
Me.ClearSelection()
iFlagValue = Value
iBase = 0
While iBase <= iFlagValue
iValue = CInt(2 ^ iBase) '2 的 N 次方
If (iFlagValue And iValue) = iValue Then
Me.Items(iBase).Selected = True
iFlagValue = iFlagValue - iValue
End If
iBase = iBase + 1
End While
End Sub
End Class
End Namespace
測試程式
在頁面上放置 TBCheckBoxList 控制項,我們只要使用 FlagValue 屬性值,就可以輕易的取得或設定複選值。
Protected Sub btnGetFlagValue_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGetFlagValue.Click
txtValue.Text = CheckBoxList1.FlagValue.ToString
End Sub
Protected Sub btnSetFlagValue_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSetFlagValue.Click
CheckBoxList1.FlagValue = CInt(txtValue.Text)
End Sub
如果 TBCheckBoxList.FlagValue 需要繫結欄位時,只需直接設定即可。