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

  • 相关阅读:
    35 点击全图后发现地图“不见了”
    34 文件地理数据库(GDB)变文件夹了怎么办
    33 ArcToolBox学习系列之数据管理工具箱——投影与变换(Projections and Transformations)未完待续……
    32 ArcToolBox学习系列之数据管理工具箱——属性域(Domains)的两种创建及使用方式
    30 ArcGIS 许可管理器常见问题(持续更新中……)
    算法竞赛入门经典 第三章 简要题解
    SCOI2003 字符串折叠 & NEERC2002 Folding 题解
    Vjios 1617 超级教主
    Codeforces Round #652 题解
    Codeforces Round #655 题解
  • 原文地址:https://www.cnblogs.com/lgx5/p/6115956.html
Copyright © 2020-2023  润新知