FindControl的使用方法

Posted 每天进步多一点

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FindControl的使用方法相关的知识,希望对你有一定的参考价值。

 Control.FindControl (String):在当前的命名容器中搜索带指定 id参数的服务器控件。(有点类似javascript中的getElementById(string))

 简单的例子:

   <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",代码中可以使用this.TextBox1来引用,这里我们使用FindControl:

  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。

 <div>

       <div id="Panel1" style="height:50px;;">

          <input name="TextBox1" type="text" value="TextBoxdsd" id="TextBox1" />

          <span id="Label1">TextBoxdsd</span>

          <input type="submit" name="Button1" value="Button" id="Button1" />

        </div>

</div>

 

当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();

以上是关于FindControl的使用方法的主要内容,如果未能解决你的问题,请参考以下文章

在面板内的控件上使用 FindControl() 返回 null

ASP.NET GridView 在 BoundField 上使用 FindControl() 来操作字段

Findcontrol 属性在 createUserWizard 中不起作用

FindControl() 返回空值

FindControl 和 INamingContainer

C#,FindControl [重复]