FindControl的详细介绍

FindControl 方法和Javascript 中的 getElementById(string) 非常相似。

FindControl的使用方法 Control.FindControl (String):在当前的命名容器中搜索带指定 id

参数的服务器控件。

Eg:

 <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="TextBox1" runat="server">TextBox</asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="Button"

OnClick="Button1_Click" />
        <br />
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label></div>
 </form>

如上段代码中,我们想定位到TextBox1 就可以用 Page.Control[0].FindControl("form1").FindControl("TextBox1")……

也可以是

 protected void Button1_Click(object sender, EventArgs e)
    {
      //Control c = this.FindControl("TextBox1");
     //TextBox tb= (TextBox)c;
     //FindControl返回的是一个Control类型的控件,需要强制类型转化成TextBox类型
      TextBox tb=(TextBox)this.FindControl("TextBox1");
      this.Label1.Text = tb.Text;   

  }

当TextBox1放到其他控件里时:

 <div>
       
        <asp:Panel ID="Panel1" runat="server" Height="50px" ;125px">
        <asp:TextBox ID="TextBox1" runat="server">TextBox</asp:TextBox>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        <asp:Button ID="Button1" runat="server" Text="Button"

OnClick="Button1_Click" />
        </asp:Panel>
    </div>

当TextBox1放到Panel里,似乎没什么影响 TextBox tb=(TextBox)this.FindControl

("TextBox1"),当查看生存页面的HTML代码是发现,TextBox的ID并没有改变,所以可以获得

TextBox1。

当TextBox1放到DataGrid中

<asp:DataGrid ID="dg1" runat="server"

OnSelectedIndexChanged="dg1_SelectedIndexChanged">
        <Columns>
        <asp:TemplateColumn>
        <ItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        </ItemTemplate>
        </asp:TemplateColumn>
            <asp:ButtonColumn CommandName="Select" Text="选择"></asp:ButtonColumn>
        </Columns>
        </asp:DataGrid>

这时候this.FindControl("TextBox1")==null,无法获得TextBox1,查看生成页面HTML发现,页

面有多个

 <input name="dg1$ctl02$TextBox1" type="text" id="dg1_ctl02_TextBox1" />

 <input name="dg1$ctl03$TextBox1" type="text" id="dg1_ctl03_TextBox1" />

TextBox1隐藏了,给DataGrid添加选择列,通过以下方法获得被选择行的TextBox1

    protected void dg1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Control c = this.dg1.Items[this.dg1.SelectedIndex].FindControl("TextBox1");
        //Control c = this.dg1.SelectedItem.FindControl("TextBox1");
        TextBox tb = (TextBox)c;
        tb.Text = "TextBox";
     
    }

  protected void dg1_EditCommand(object source, DataGridCommandEventArgs e)
    {
        TextBox tb = (TextBox)e.Item.FindControl("TextBox1");
        this.Label1.Text = tb.Text.ToString();
    }


如果是在DataGrid的页眉和页脚:

((TextBox)this.dg1.Controls[0].Controls[0].FindControl("TextBoxH")).Text = "Head";
 ((TextBox)this.dg1.Controls[0].Controls[this.dg1.Controls[0].Controls.Count -

1].FindControl("TextBoxF")).Text = "Footer";

TextBox1在Repeater中

   <asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1"

OnItemCommand="Repeater1_ItemCommand">
        <ItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server" Text=""></asp:TextBox><%

#DataBinder.Eval(Container.DataItem,"ProductName")%><asp:Button ID="btn"

OnClick="btn_click" runat="server" Text="dddd" /><br />
        </ItemTemplate>
        </asp:Repeater>

通过按钮来获得TextBox1:

    protected void btn_click(object sender, EventArgs e)     {         //获得按钮         Button btn = (Button)sender;         TextBox tb = (TextBox)btn.Parent.FindControl("TextBox1");         tb.Text = "Text";     }

或者

  foreach (RepeaterItem item in this.Repeater1.Items)         {             ((TextBox)item.FindControl("TextBox1")).Text = "Text2";         }

自定义控件里的TextBox1

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs"

Inherits="WebUserControl" %> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

 引用<uc1:WebUserControl ID="WebUserControl1" runat="server" />

获取TextBox1:

((TextBox)this.WebUserControl1.FindControl("TextBox1")).Text = "userc";

模板页访问页面TextBox1

        //模板页的TextBox1         TextBox tbM = (TextBox)this.FindControl("TextBox1");         //页面中的TextBox1         TextBox tbC = (TextBox)this.FindControl("ContentPlaceHolder1").FindControl

("TextBox1");         tbC.Text = tbM.Text;

页面使用模板页的TextBox1

        //模板页的TextBox1         TextBox tbM = (TextBox)Master.FindControl("TextBox1");         //本页面的TextBox1         //错误的方法:TextBox tbC = (TextBox)this.FindControl("TextBox1");         TextBox tbC = (TextBox)Master.FindControl

("ContentPlaceHolder1").FindControl("TextBox1");         tbM.Text = tbC.Text.ToString();

【参考】http://www.cnblogs.com/12go/archive/2011/11/27/2264853.html

原文地址:https://www.cnblogs.com/zhanggongchang/p/4661895.html