解決使用Page.FindControl方法找不到指定控件的問題

ASP.NET開發人員在使用一些動態導入控件的功能的時候, 常會遇到這樣一個問題: 就是明明有這個ControlID, 但使用Page.FindControl(ControlID)得到的結果卻是null, 這是bug? 還是某種不明機制?

首先要說的是, 這不是bug. 而爲何使用Page.FindControl方法找不到指定控件, 我們可以在該頁的頁指令中添加 Trace=Ture 指令來跟蹤頁面輸出查看控件樹。

其次,得說一下FindControl方法的實現機制,FindControl方法是在當前naming container查找指定ControlID對應的控件,該naming container是一個實現了INamingContainer接口的對象。問題的關鍵是,Page是指定ControlID的當前naming container麼?

一個頁面的控件樹中,Page對象必然是頂級的naming container,但絕非必然是唯一的naming container。譬如當有GridView存在的話,GridView其實也是一個naming container,要找GridView中的一個ControlID,就不能用Page.FindControl,而得用[GridView對象].FindControl方法。

再譬如最普遍的,在ASP.NET 2.0中,引入了MasterPage的機制,在當前頁使用MasterPage的情況下,當前頁也產生了類似ContentPlaceholder1這樣的naming container,這時查找當前頁的控件,也不能使用Page.FindControl方法,而得要用ContentPlaceholder1.FindControl方法。

很多時候,因爲是動態控件,明知道是在同一個naming container中,但不知道該naming container是什麼對象,一個控件要找到另一個控件,可以用this.Parent.FindControl方法。

至此問題解決,祝新年快樂!

發佈了0 篇原創文章 · 獲贊 0 · 訪問量 1645
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章