[C#]ListControl SelectedValue 錯誤<Ignorance系列>
前幾天使用RadioButtonList給值時,使用SelectedValue發生錯誤,
擁有的 SelectedValue 無效,因為它不在項目清單中。
這個錯誤網路上很多遭遇過相同問題的人,也很多熱心的人給予解答,
放上相關連結供大家與自己參考:
不過讓我感到意外,因為寫程式半年了,一直以來都是用同樣的方式給值,也從沒遇過這個問題,以下為一直以來都這樣寫的code,這邊故意給空值,模擬從資料庫抓出空值時的狀況,DBNull已轉成空字串,所以不是DBNull的因素。
後置碼:
RadioButtonList1.SelectedValue = string.Empty;
前置碼:
<asp:RadioButtonList ID="RadioButtonList1" runat="server">
<asp:ListItem>男</asp:ListItem>
<asp:ListItem>女</asp:ListItem>
</asp:RadioButtonList>
這樣不會產生:擁有的 SelectedValue 無效,因為它不在項目清單中。
可以跑,也沒有如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:
按下按鈕,將UserControl Visible屬性設為 true。
最後說一下怎麼解決這個問題,
原先想參考ASP.NET 魔法學院的方法,該文章覆寫SelectedValue,記得ASP.NET 魔法學院有在寫一篇將此方法更加完整的文章,有興趣的可以參考[ASP.NET 控制項實作 Day22] 讓 DropDownList 不再因項目清單不存在而造成錯誤。
而我的做法是寫一個ListControl的擴充方法,檢查ListItem清單是否有設定的值,有將Item Selected 設為 true。
至今還是很好奇為什麼在Page中,沒有擲回 System.ArgumentOutOfRangeException。
如文章有錯誤,煩請告知,新人發帖請多包涵