擴展 CheckBoxList 控制項 - 繫結複選項目

擴展 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 屬性值,就可以輕易的取得或設定複選值。

image

    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 需要繫結欄位時,只需直接設定即可。

image

ASP.NET 魔法學院