[ASP.NET 自訂控制項]CheckBoxList複選的SelectedValue,用逗號串接

  • 60520
  • 0

[ASP.NET 自訂控制項]CheckBoxList複選的SelectedValue,用逗號串接

寫程式寫到現在,我還是覺得.NET的CheckBoxList控制項很奇怪,超怪。

明明是複選控制項,為什麼SelectedValue,只抓的到勾選裡面index最低的一筆?!(還是我一直誤會它很久了??)

與其每次抓值都去跑loop,那我還不如自己覆寫掉SelectedValue的屬性,徹底讓使用的人無腦化!

 

Step1:

新增一個類別叫做JoeyCheckBoxList.cs,接著我們的重點,只有覆寫掉SelectedValue。

這邊使用的分隔符號是「逗號」,如果要用「分號」或其他自訂符號,要額外再開立屬性出來也可以,不難我就不在這邊多做解釋了。

using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Joey
{
    public class JoeyCheckBoxlist: CheckBoxList
    {

        /// <summary>
        /// 取得清單控制項中選取項目的值,或選取清單控制項中包含特定數值的項目。
        /// </summary>
        /// <value></value>
        /// <returns>
        /// 清單控制項中選取項目的值。預設值為空字串 ("")。
        /// </returns>
        /// <remarks>
        /// 假如item有1,2,3,a。
        /// 當SelectedValue="1,a,b",則1與a的項目會被勾選,不會出現exception。
        /// 假如勾選2與3與a,則SelectedValue="2,3,a"
        /// </remarks>
        public override string SelectedValue
        {
            get
            {
                string _ReturnValue = "";
                this.EnsureChildControls();               

                for (int i = 0; i < this.Items.Count ; i++)
                {
                    if (this.Items[i].Selected == true)
                    {
                        _ReturnValue += this.Items[i].Value + ",";
                    }
                }
                if (!string.IsNullOrEmpty(_ReturnValue))
                {
                    _ReturnValue = _ReturnValue.TrimEnd(',');
                }
                else
                {
                    return string.Empty;
                }

                return _ReturnValue;
            }

            set
            {
                if (value == null)
                {
                    value = string.Empty;
                }
                string _ReturnValue = "";
                
                this.EnsureChildControls();
                _ReturnValue = value;


                for (int i = 0; i < this.Items.Count; i++)
                {
                    this.Items[i].Selected = false;
                }

                if (_ReturnValue.ToString().Trim().Length != 0)                
                {
                    string[] ReturnValue1 = _ReturnValue.Split(',');
                    // 1,2,3
                    for (int intItem = 0; intItem <= ReturnValue1.Length - 1; intItem++)
                    {
                        for (int i = 0; i < this.Items.Count; i++)
                        {
                            if (ReturnValue1[intItem] == this.Items[i].Value)
                            {
                                this.Items[i].Selected = true;
                                break; 
                            }
                        }
                    }
                }
            }
        }


    }
}

 

Step2:

大功告成!接著我們來測試一下這個屬性,

假設我有一個NET原生的CheckboxList,有一個JoeyCheckBoxList,Item分別是1,2,3,a。

先在Page_Load給SelectedValue=”2,a,b,c”,當然啦,NET的沒這麼聰明看的懂”,”,

Button.Click()後,去選取畫面上的值,原生的checkboxlist我們選1跟3,自訂的checkboxlist我們選2跟a來看看結果。

aspx:


<%@ Register Assembly="Joey" Namespace="Joey" TagPrefix="cc1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>未命名頁面</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:CheckBoxList ID="CheckBoxList1" runat="server">
            <asp:ListItem Value="1">
            </asp:ListItem>
            <asp:ListItem Value="2">
            </asp:ListItem>
            <asp:ListItem Value="3">
            </asp:ListItem>
            <asp:ListItem Value="a">
            </asp:ListItem>
        </asp:CheckBoxList>
        <cc1:JoeyCheckBoxlist ID="JoeyCheckBoxlist1" runat="server">
            <asp:ListItem Value="1">
            </asp:ListItem>
            <asp:ListItem Value="2">
            </asp:ListItem>
            <asp:ListItem Value="3">
            </asp:ListItem>
            <asp:ListItem Value="a">
            </asp:ListItem>
        </cc1:JoeyCheckBoxlist>
        <br />
        <asp:Label ID="Label1" runat="server" Text="asp checkboxlist"></asp:Label>
        <br />
        <asp:Label ID="Label2" runat="server" Text="JoeyCheckBoxlist1"></asp:Label>
        <br />
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
    </div>
    </form>
</body>
</html>

.cs

using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class CheckBoxListTest : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            this.CheckBoxList1.SelectedValue = "2,a,b,c";    
            this.JoeyCheckBoxlist1.SelectedValue = "2,a,b,c";    
        }
        
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        this.Label1.Text = "ASP的SelectedValue:"+this.CheckBoxList1.SelectedValue;
        this.Label2.Text = "JOEY的SelectedValue:" + this.JoeyCheckBoxlist1.SelectedValue;
    }
}

Page第一次Load進來的畫面:

Load

原生的checkboxlist我們選1跟3,自訂的checkboxlist我們選2跟a,點了按鈕之後的畫面:

click

會發現,原生的checkboxlist.selectedvalue,只抓的到”1”,如果是選2跟a,則只抓的到”2”。

個人深深的感覺是原生的checkboxlist在取值時的loop中break寫太快了。

總之,原生的用起來就是很怪。希望這個覆寫SelectedValue的屬性對大家有幫助。


或許您會對下列培訓課程感興趣:

  1. 2021/1/9:【針對遺留代碼加入單元測試的藝術】202101 - 台北
  2. 2021/1/10:【極速開發+】 202101 台北
  3. 2021/2/20~2021/2/21:【演化式設計】測試驅動開發與持續重構 202102

想收到第一手公開培訓課程資訊,或想詢問企業內訓、顧問、教練、諮詢服務的,請洽 Facebook 粉絲專頁:91敏捷開發之路