[CheckBoxList] 找出 CheckBoxList 中被勾選或取消勾選的那個項目

今天遇到這個問題時,原本還不以為有什麼難,卻沒想到還頗費了一番功夫才終於找出可行的辦法,而且解法看起來不是很 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 就可以了,不需要這麼麻煩。


Dev 2Share @ 點部落