摘要

承上篇「擴展 CheckBoxList 控制項 - 繫結複選項目」中以整數值來描述複選項目,本文將以另一種方式,利用 Item 的 Value 或 Text 屬性來描述複選項目,每個被勾選的項目,會將其 Value 或 Text 屬性值,以逗點分隔的方式被記錄下來。例如

選項一.Value = 1

選項二.Value = 2

選項三.Value = 3

選項四.Value = 4

當複選了「選項一」及「選項三」,則複選值為 "1,3"。當複選了「選項二」及「選項四」,則複選值為 "2,4"。若要使用上述的方式來描述複選項目,一般要自行撰寫程式碼來處理。本文將擴展 CheckBoxList 控制項,直接透過屬性來雙向繫結這個複選值。

擴展 CheckBoxList 控制項

繼承 CheckBoxList 命名為 TBCheckBoxList,新增 SelectedValueList屬性,來描述目複選的 Value 值(以逗號分隔),新增 SelectedTextList 屬性,來描述項目複選的 Text 值(以逗號分隔)。

 

Imports System.Web.UI.WebControls
Imports System.ComponentModel
Imports System.Text

Namespace WebControls
    Public Class TBCheckBoxList
        Inherits CheckBoxList

        ''' <summary>
        ''' 項目複選的 Value 值,以逗號分隔每個項目。
        ''' </summary>
        < _
        Description("項目複選的 Value 值,以逗號分隔每個項目。"), _
        Bindable(True), _
        Browsable(False) _
        > _
        Public Property SelectedValueList() As String
            Get
                Return GetSelectedValueList()
            End Get
            Set(ByVal value As String)
                SetSelectedValueList(value)
            End Set
        End Property

        ''' <summary>
        ''' 取得項目複選的 Value 值。
        ''' </summary>
        Private Function GetSelectedValueList() As String
            Dim oValues As StringBuilder
            Dim oItem As ListItem

            oValues = New StringBuilder()
            For Each oItem In Me.Items
                If oItem.Selected Then
                    If oValues.Length > 0 Then oValues.Append(",")
                    oValues.Append(oItem.Value)
                End If
            Next
            Return oValues.ToString()
        End Function

        ''' <summary>
        ''' 設定項目複選的 Value 值。
        ''' </summary>
        ''' <param name="Value">複選 Value 值。</param>
        Private Sub SetSelectedValueList(ByVal Value As String)
            Dim oValues() As String
            Dim sValue As String
            Dim oItem As ListItem

            Me.ClearSelection()
            oValues = Split(Value, ",")
            For Each sValue In oValues
                oItem = Me.Items.FindByValue(sValue)
                If oItem IsNot Nothing Then
                    oItem.Selected = True
                End If
            Next
        End Sub

        ''' <summary>
        ''' 項目複選的 Text 值,以逗號分隔每個項目。
        ''' </summary>
        < _
        Description("項目複選的 Text 值,以逗號分隔每個項目。"), _
        Bindable(True), _
        Browsable(False) _
        > _
        Public Property SelectedTextList() As String
            Get
                Return GetSelectedTextList()
            End Get
            Set(ByVal value As String)
                SetSelectedTextList(value)
            End Set
        End Property

        ''' <summary>
        ''' 取得項目複選的 Text 值。
        ''' </summary>
        Private Function GetSelectedTextList() As String
            Dim oValues As StringBuilder
            Dim oItem As ListItem

            oValues = New StringBuilder()
            For Each oItem In Me.Items
                If oItem.Selected Then
                    If oValues.Length > 0 Then oValues.Append(",")
                    oValues.Append(oItem.Text)
                End If
            Next
            Return oValues.ToString()
        End Function

        ''' <summary>
        ''' 設定項目複選的 Text 值。
        ''' </summary>
        ''' <param name="Value">複選 Text 值。</param>
        Private Sub SetSelectedTextList(ByVal Value As String)
            Dim oValues() As String
            Dim sValue As String
            Dim oItem As ListItem

            Me.ClearSelection()
            oValues = Split(Value, ",")
            For Each sValue In oValues
                oItem = Me.Items.FindByText(sValue)
                If oItem IsNot Nothing Then
                    oItem.Selected = True
                End If
            Next
        End Sub

    End Class
End Namespace

 

測試程式

在頁面上放置 TBCheckBoxList 控制項,我們只要使用 SelectedValueList 或 SelectedTextList 屬性值,就可以輕易的取得或設定複選值。

image

image

   Protected Sub btnGetSelectedValueList_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGetSelectedValueList.Click
        txtValue.Text = CheckBoxList1.SelectedValueList
    End Sub

    Protected Sub btnSetSelectedValueList_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSetSelectedValueList.Click
        CheckBoxList1.SelectedValueList = txtValue.Text
    End Sub


    Protected Sub btnGetSelectedTextList_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGetSelectedTextList.Click
        txtValue.Text = CheckBoxList1.SelectedTextList
    End Sub

    Protected Sub btnSetSelectedTextList_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSetSelectedTextList.Click
        CheckBoxList1.SelectedTextList = txtValue.Text
    End Sub

如果 TBCheckBoxList 的 SelectedValueList 及 SelectedTextList 屬性需要繫結欄位時,只需直接設定即可。

image

ASP.NET 魔法學院


DotBlogs Tags: CheckBoxList ServerControl

Feedback

  • R 2008/5/29 上午 09:39 回覆

    # re: 擴展 CheckBoxList 控制項 - 繫結複選項目(2)

    請問一下,支援到2的幾次方
    會不會選項太多會爆掉溢位

  • jeff377 2008/5/29 下午 03:19 回覆

    # re: 擴展 CheckBoxList 控制項 - 繫結複選項目(2)

    能支援到 2 的幾次方,是要看該屬性的整數型別,目前是設為 Integer,若不夠的話,可以改為 Long 甚至更大。

  • Vincent Lin 2008/9/13 下午 02:56 回覆

    # re: 擴展 CheckBoxList 控制項 - 繫結複選項目(2)

    大大您好:
    很想是是您的方法...
    可否參考您整個完整檔案...
    感恩!
    doggy 敬上!
    vincent_lin@seed.net.tw

  • jeff 2008/9/15 下午 07:32 回覆

    # re: 擴展 CheckBoxList 控制項 - 繫結複選項目(2)

    to Vincent Lin :
    文中的 TBCheckBoxList 已經是完整程式碼,直接開新的「伺服器控制項專案」,加入此類別即可。

  • hatelove 2009/1/13 下午 11:32 回覆

    # re: 擴展 CheckBoxList 控制項 - 繫結複選項目(2)

    喔喔,jeff大,我看到這篇了,

    可惜沒早個兩年看到,不然當初設計就不會這麼痛苦了。XD

     

  • Andrew 2009/1/16 下午 04:04 回覆

    # re: 擴展 CheckBoxList 控制項 - 繫結複選項目(2)

    真是太厲害了..
    可是不會用..
    不知道怎麼開新的伺服器控制項專案...
    我是超新手= =

  • hatelove 2009/1/16 下午 06:12 回覆

    # re: 擴展 CheckBoxList 控制項 - 繫結複選項目(2)

    新增類別庫專案,加入相關參考跟自己設計的類別。

    建置就會產生.dll檔,

    在網站裡面把該dll檔加入參考,工具箱就會你自己設計的控制項。

    工具箱沒有,可自行將 dll拉至工具箱中,也會產生自己設計的control,就可以使用。

  • jeff377 2009/1/17 下午 04:36 回覆

    # re: 擴展 CheckBoxList 控制項 - 繫結複選項目(2)

    to Andrew :

    下面有完整的教學

    http://www.dotblogs.com.tw/jeff377/archive/2008/10/02/5562.aspx

  • 楊Kiwi 2009/12/21 下午 06:03 回覆

    # re: 擴展 CheckBoxList 控制項 - 繫結複選項目(2)

    jeff大大:

    不好意思想請問一下,當我使用了上述的方法後,有一點小小的問題就是SetSelectedTextList(Value)沒辦法去讓控制項選取,是不是我在哪邊設定錯了呢?

     

標題 *
名稱 *
Email (將不會被顯示)
Url
回應
登入後使用進階評論
Please add 4 and 8 and type the answer here: