FindControl 找控件
FindControl 是 ASP.NET 工程師十分常用的 Method,但初學(xué)者應(yīng)該常常會(huì)遇到使用 FindControl 卻找不到 Control 的狀況!
首先,在 ASP.NET 中有所謂 NamingContainer (命名容器) 的觀念,在使用 Data-bound Control ( 資料控制項(xiàng) ) 時(shí),會(huì)用到 ItemTemplate 之類(ITemplate)的標(biāo)籤,裡面還會(huì)包含許多 Control,這些包含在 Template 裡面的 Control 其實(shí)是跟原本頁面(Page)中的控制項(xiàng)是不同階層的!而這些被 ITemplate 包含的 Controls 其 NamingContainer 就是這個(gè) Data-bound Control 的每一個(gè) ItemTemplate!
在這種情況下,若要在 Code behind 中使用 Page.FindControl 想直接找到這些 Data-bound Control 的 Template 中的 Control 的話,就沒辦法直接用 Control ID 找到這個(gè) Control。
例如:
[code:html]
[/code]
在 Code behind 的 Page_Load 事件中要尋找 Repeater1 中第一個(gè) TextBox1 時(shí),使用以下的程式碼就會(huì)出錯(cuò),因?yàn)檎也坏?TextBox1:
[code:c#]
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
}
[/code]
如果要透過 FindControl 找到控制項(xiàng)的話,我是有以下 4 種技巧分享給大家:
1. 透過實(shí)做 Repeater1 的 ItemDataBound 事件來取得每一個(gè) ItemTemplate 中 TextBox1 的控制項(xiàng)
這是最常見的用法!
[code:c#]
[/code]
2. 透過 Repeater1.Items[0].FindControl("TextBox1") 找到第一個(gè) ItemTemplate 中的 TextBox1 控制項(xiàng)
這是取得第一個(gè) ItemTemplate 中的 TextBox1 的常見用法!
3. 透過 Page.FindControl("Repeater1$ctl00$TextBox1") 找到第一個(gè) ItemTemplate 中的 TextBox1 控制項(xiàng)
4. 透過 FindControl<TextBox>("TextBox1") 找到整個(gè)頁面中第一個(gè)出現(xiàn)的 TextBox1 控制項(xiàng)(不一定在 Repeater1 裡面)
這是透過一個(gè)自訂的泛型遞迴方法(Generic Recursive Method)達(dá)成。
要使用這段程式比需將以下的程式碼複製到你的頁面的類別(Code behind)中。
( 以下程式碼參考自:http://blogs.interfacett.com/michael-palermo/2007/4/13/recursive-findcontrolt.html
[code:c#]