KB-Radio Button Behavior
4 |
protected void Page_Load(object sender, EventArgs e)
{
RadioButtonList1.Items.Clear();
//加入Item1, Item2, Item3, Value分別為1,2,3
for (int i = 1; i <= 3; i++)
RadioButtonList1.Items.Add(
new ListItem("Item" + i.ToString(), i.ToString())
);
//預設點選Item3
RadioButtonList1.Items[2].Selected = true;
//假裝我們由資料庫取得數值
string selValue = "2";
//透過迴圈,比對ListItem.Value,將符合者設為Selected
foreach (ListItem item in RadioButtonList1.Items)
{
if (item.Value == selValue)
{
item.Selected = true;
break;
}
}
}
又被蟲咬了!
有沒有人看出以上的Code有什麼問題? 我們在RadioButtonList中加入三個選項,預設第三個選項為Selected,然後用數值"2"去比對三個ListItem的Value,由於Radio Button中只能有一個被選取,找到設成Selected後就Break。
所以網頁上應該是Item2被選取,對吧? [上面這是笨方法呀! 小朋友不要學,請看以下Update的部分]
錯!!! 是Item3...
我以為RadioButtonList在我們設定某個ListItem.Selected=true時,會幫忙將其他ListItem的Selected都設成false,但事實上RadioButtonList並沒有想像中貼心。所有Selected的ListItem都會轉成<input type="radio" checked="checked">,當IE/Firefox發現同一組Radio中有多<input type="radio">設為checked時,只有最後一個會顯示為選取。如果用Javascript檢查,多筆checked的,一樣只有最後一個<input type="radio">的checked的屬性會傳回true。It's by design~~~
[Update 2007-09-07]
哈! 又發現一個自己笨了很久的地方。過去看SelectedValue的說明,只看了前半段:
Gets the value of the selected item in the list control, or selects the item in the list control that contains the specified value.
沒注意到後面的綠色部分,一直以為它是唯讀的。所以,這篇文章就當我沒說吧! 用RadioButtonList1.SelectedValue = selValue就好了,什麼麻煩都沒有!!
(唯一點點不同之處在於,SelectedValue在比對不到時,會保留原來的選項,而前述的方法,則會全都不選,但實務應用上不太會發生這種狀況就是了。)
謝謝evakey的指點!!
Comments
# by evakey
使用 RadioButtonList1.SelectedValue = selValue; 的方式會不會比較好呢?
# by Jeffrey
謝謝evakey的指點,我又甩掉一個笨方法了!! ^__^
# by Longer
我會建議這樣寫,不必另寫迴圈比對值 RadioButtonList1.SelectedIndex = RadioButtonList1.Items.IndexOf(RadioButtonList1.Items.FindByValue(selValue ));
# by Thank You
超感謝的!!