今天遇到這個問題時,原本還不以為有什麼難,卻沒想到還頗費了一番功夫才終於找出可行的辦法,而且解法看起來不是很 Graceful,有一點點 Hacking 的感覺。基本上我們可以選擇最簡單的做法,那就是使用 For Each li As ListItem In CheckBoxList1.Items 指令去掃描 CheckBoxList1 裡面的所有 CheckBox,看來這也是 ASP.NET 企圖要我們使用的原始方法...
今天遇到這個問題時,原本還不以為有什麼難,卻沒想到還頗費了一番功夫才終於找出可行的辦法,而且解法看起來不是很 Graceful,有一點點 Hacking 的感覺。基本上我們可以選擇最簡單的做法,那就是使用 For Each li As ListItem In CheckBoxList1.Items 指令去掃描 CheckBoxList1 裡面的所有 CheckBox,看來這也是 ASP.NET 企圖要我們使用的原始方法。
不過話說回來,如果 CheckBoxList1.Items 很多,那麼每次都要跑一整個迴圈,而且還找不到到底是哪個 CheckBox 被使用者選到了,那麼程式就會非常沒有效率。為什麼不能一下就找到那個該死的 CheckBox 呢?主要的問題出在於在 CheckBoxList 的 SelectedIndexChanged 事件中傳回的是最普通 System.EventArgs 型別,讓人很難從它取到太多有用的資訊。
最後我採取一個可行(雖然不見得最好)的做法,那就是直接使用 Request.Form("__EVENTTARGET") 去取回目標控制項的回傳值,再做字串處理以解析出其 Index 值,如以下程式範例:
VB:
Dim args As String = Request.Form("__EVENTTARGET")
Dim arg() As String = Split(args, "$")
Dim index As Integer = arg(arg.Length - 1)
Dim CheckedOrUncheckedItem As String = cbl.Items(index).Text;
C#:
string args = Request.Form["__EVENTTARGET"]; string[] arg = args.Split('$'); int index = int.Parse(arg[arg.Length - 1]); string CheckedOrUncheckedItem = cbl.Items[index].Text + " is " + ((cbl.Items[index].Selected) ? " checked." : " unchecked.");
同樣的做法應該也適用於 RadioButtonList。不過對 RadioButtonList 直接使用 SelectedIndex 就可以了,不需要這麼麻煩。