[C#]ListControl SelectedValue 無效

[C#]ListControl SelectedValue 錯誤<Ignorance系列>

前幾天使用RadioButtonList給值時,使用SelectedValue發生錯誤,

擁有的 SelectedValue 無效,因為它不在項目清單中。

這個錯誤網路上很多遭遇過相同問題的人,也很多熱心的人給予解答,

放上相關連結供大家與自己參考:

MSDN論壇

不過讓我感到意外,因為寫程式半年了,一直以來都是用同樣的方式給值,也從沒遇過這個問題,以下為一直以來都這樣寫的code,這邊故意給空值,模擬從資料庫抓出空值時的狀況,DBNull已轉成空字串,所以不是DBNull的因素。

後置碼:

 RadioButtonList1.SelectedValue = string.Empty;

前置碼:

            <asp:RadioButtonList ID="RadioButtonList1" runat="server">
                <asp:ListItem>男</asp:ListItem>
                <asp:ListItem>女</asp:ListItem>
            </asp:RadioButtonList>

這樣不會產生:擁有的 SelectedValue 無效,因為它不在項目清單中。

以下為我將給值動作寫在Page_Load的Output
2012-05-27_210858

可以跑,也沒有如MSDN中所說的,

SelectedValue 屬性也可用來選取清單控制項中的項目。如果清單控制項中的項目都不包含指定的值,則擲回 System.ArgumentOutOfRangeException

就因為我的無知,一直以來就相信這樣寫就沒問題了,而讓我知道會置出擲回例外狀況的狀況請看以下詳細說明。

1.我將RadioButtonList放置於UserControl裡面,並在UserControl的Page_Load裡將RadioButtonList.SelectedValue 放入空字串。

2.將UserControl拉進Page中,並且將拉進來的UserControl Visible屬性設為 false。

3.在page中拉入Button,並且在Button的Click事件中,將UserControl Visible屬性設為 true。

當按下按鈕就會擲回 System.ArgumentOutOfRangeException

這邊好玩的是Page就不會擲回,但UserControl就會!

Page:

 

    <div>
        Page:
        <asp:RadioButtonList ID="RadioButtonList1" runat="server">
            <asp:ListItem>男</asp:ListItem>
            <asp:ListItem>女</asp:ListItem>
        </asp:RadioButtonList>
        <br />
        UserControl:
        <uc2:WebUserControl1 ID="WebUserControl11" runat="server" Visible="false" />
        <br />
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
    </div>

 

        protected void Page_Load(object sender, EventArgs e)
        {
            RadioButtonList1.SelectedValue = string.Empty;
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            WebUserControl11.Visible = true;
        }

UserControl:

 

<asp:RadioButtonList ID="RadioButtonList1" runat="server">
    <asp:ListItem>男</asp:ListItem>
    <asp:ListItem>女</asp:ListItem>
</asp:RadioButtonList>

 

        protected void Page_Load(object sender, EventArgs e)
        {
            RadioButtonList1.SelectedValue = string.Empty;
        }

 

 

 

Output:

2012-05-27_212416

按下按鈕,將UserControl Visible屬性設為 true。

2012-05-27_212512

 

最後說一下怎麼解決這個問題,

 

原先想參考ASP.NET 魔法學院的方法,該文章覆寫SelectedValue,記得ASP.NET 魔法學院有在寫一篇將此方法更加完整的文章,有興趣的可以參考[ASP.NET 控制項實作 Day22] 讓 DropDownList 不再因項目清單不存在而造成錯誤

而我的做法是寫一個ListControl的擴充方法,檢查ListItem清單是否有設定的值,有將Item Selected 設為 true。

至今還是很好奇為什麼在Page中,沒有擲回 System.ArgumentOutOfRangeException

 

如文章有錯誤,煩請告知,新人發帖請多包涵

 

創用 CC 授權條款