【问题标题】:Cannot find TextBox on Page在页面上找不到文本框
【发布时间】:2012-03-20 03:51:45
【问题描述】:

我在页面上有一个文本框,但是当我使用时

TextBox formTextBox = Page.FindControl(textBox) as TextBox;

它回来了null。有没有解决的办法?我知道控件在页面上,但我找不到它。

谢谢

【问题讨论】:

  • 你知道控件在页面上,但是在哪里?你能显示你的标记吗?除此之外,您是否使用MasterPages?如果这是真的,请查看我对另一个问题的回答:stackoverflow.com/a/8163964/284240
  • 它是否在母版页的内容区域中?
  • 是的,它在母版页的内容区域中
  • 这里是MSDN link,关于如何引用母版页内容。

标签: asp.net


【解决方案1】:

在标记中的文本框周围放置一个占位符,如下所示:

<asp:PlaceHolder ID="MyPlaceHolder" runat="server>
  <asp:TextBox ID="MyTextBox" runat="server" />
</asp:PlaceHolder>

然后你可以使用:

TextBox formTextBox = MyPlaceHolder.FindControl("MyTextBox") as TextBox;

【讨论】:

    【解决方案2】:

    如果您使用MasterPages 并且此控件位于位于ContentPlaceholder 中的页面中,则无法直接通过FindControl 获取对控件的引用,因为页面ControlCollection 中的唯一控件是母版页本身。 这就说得通了。当控件位于具有 MasterPage 的页面的顶层时,您不能保证 ID 是唯一的,因为其他 ContentPage 也可能具有具有此 ID 的控件,而 FindControl 今天可能会返回另一个控件而不是明天。

    如果您查看要查找的控件的NamingContainer,您会发现在MasterPage 的情况下是ContentPlaceHolder,在“正常”页面的情况下是页面本身。

    所以在通过 FindControl 找到控件之前,您需要先获取 MasterPage 的 ContentPlaceholder 的引用:

    Page.Master.FindControl("ContentPlaceHolder1").FindControl("TextBox1");
    

    http://msdn.microsoft.com/en-us/library/xxwa0ff0.aspx

    但是你为什么不直接引用你的控件呢?例如:

    this.TextBox1.Text = "Hello World";
    

    顺便说一句,这是源自my own answer on a similar question

    【讨论】:

    • 我很好奇他为什么不直接引用它。
    【解决方案3】:

    正在发生两件事中的一件......要么找不到控件(这是最有可能的),要么没有返回TextBox 对象。

    关于FindControl 要记住的是它不是递归的......它只会查看顶级子控件。因此,如果您的文本框嵌套在另一个控件中,将找不到它。你可以read the MSDN docs here

    您可能想要创建自己的 FindControl 版本,以便在嵌套控件中进行搜索——实现这样的方法很简单,可以使用您的 google-foo 轻松找到

    【讨论】:

    • 我确定递归查找器已经存在,他只需要查找它。
    • 嗨,它只嵌套在一个div中。
    • @jcolebrand 其他人写过这样的,但它在 API 中不存在。你必须自己实现或借用别人的
    • @WesleySkeen 那么您需要在该 div 中进行搜索。给它一个 id 和 runat=server (所以一个
    • @jcolebrand:一个 div(或 Panel)没有实现 INamingContainer。
    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 2016-03-19
    • 2021-01-15
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多