2012-03-01 58 views
0

发现文本框我有一个页面上的文本框,但是当我使用无法在页面

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

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

感谢

+1

什么'textBox':

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

然后你就可以用鳍文本框? – SLaks 2012-03-01 16:17:39

+1

你知道控件在页面上,但是**哪里**?你能收到你的标记吗?除此之外,你在使用'MasterPages'吗?如果这是真的,请查看我对另一个问题的回答:http://stackoverflow.com/a/8163964/284240 – 2012-03-01 16:18:12

+0

它是否位于母版页的内容区域中? – Zachary 2012-03-01 16:20:09

回答

4

如果您使用MasterPages发现,这控件位于ContentPlaceholder的页面中,因为该页面的ControlCollection中唯一的控件是MasterPage本身,所以无法直接通过FindControl获得对控件的引用。 这很有道理。当控件位于使用MasterPage的页面的顶层时,您无法保证该ID是唯一的,因为其他ContentPages也可能拥有此ID的控件,并且现在可以返回另一个控件,而不是明天。

如果你看看你想找到的控制的NamingContainer,你会发现如果是MasterPage这是ContentPlaceHolder,并且在“正常”页面的情况下它是页面本身。

所以,你需要首先得到的母版的的ContentPlaceHolder参考之前,你可以找到通过的FindControl控制:

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得出的。

+0

我很好奇他为什么不直接引用它。 – jcolebrand 2012-03-01 16:42:31

0

两种情况之一发生了......无论是控制不被发现(这是最有可能的),或者未返回TextBox对象。

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

你可能想使自己的FindControl的版本,这将使嵌套控件内搜索 - 实现这种方法是简单,而且很容易地使用谷歌,富

+0

我确定递归查找器已经存在,他只需要查找它。 – jcolebrand 2012-03-01 16:22:11

+0

嗨,它只是在一个div中。 – 2012-03-01 16:23:53

+0

@jcolebrand其他人已经写过这样的内容,但它不存在于API中。你必须自己实现它或借用别人的 – 2012-03-01 16:24:57

0

地方放支架绕文本框的标记,像这样:

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