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

超感謝的!!

Post a comment