[ASP.NET] 簡單利用Event Object Sender來FindControl
說到FindControl應該都不陌生,但類似如何取得某某Control的問題可沒間斷過,
之前曾經寫了一篇有關FindControl的分享文(透析FindControl),裡頭有談到
要順利Find到Control,最重要的是必須要能知道NamingContainer是誰。
昨天剛好又連續看到二篇網路上的有關FindControl的發問,其中一則問題是在
DetailsView裡包了Repeater,然後在Repeater再含有一個CheckBox及CheckList
,而需求是要再CheckBox的Server端CheckedChanged Event中,同時改變CheckList
Item的Checked狀態,先故且不論為何不在Client端利用jQuery or JavaScript等技
術去完成,就這個需求來看,由於是在某個Control的Event下要來FindControl,
所以就來看看如何完成。
其實並不難,一開始已經提到了要想辦法取得NamingContainer,而一般在Control
的Event中,我們可以看到有二個常見的參數,Object Sender及EventArgs e,這二個
參數的意義簡單的來說:
- Object Sender:指的是引發該事件的來源對象是誰
- EventArgs e:是在該事件中,我們可以細部去使用到細節資料有哪些
因此我們可以藉由取得該事件的引發對象是誰,來進一步取得NamingContainer,有了
NamingContainer,要FindControl就不是問題了,要是再Find不到,那就是你的程式
碼問題,不外乎是ID弄錯啦之類的
範例程式碼如下:
protected void chkAuthorityGroup_CheckedChanged(object sender, EventArgs e)
{
CheckBox ck = (CheckBox)sender; //取得引發事件的對象是哪位
//利用該引發事件的那位主角,使用NamingContainer來找到相同位階的其它Control
CheckBoxList cklist = (CheckBoxList)ck.NamingContainer.FindControl("chkAuthority");
for (int i = 0; i < cklist.Items.Count; i++)
{
cklist.Items[i].Selected = ck.Checked;
}
}
PS:此範例碼沒有很嚴僅,其餘相關判斷請自行加入,以免產生Exception
By No.18