[ASP.NET] 簡單利用Event Object Sender來FindControl

  • 8465
  • 0

[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