首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FindControl和INamingContainer

FindControl和INamingContainer
EN

Stack Overflow用户
提问于 2011-11-17 08:04:17
回答 2查看 1.1K关注 0票数 1

我想仔细回答这个问题,这样有帮助的人就不会花时间告诉我我已经知道的信息(我不想浪费他们的时间)。

我想了解FindControl如何在ASP.NET web应用程序项目中工作( c#文件在标记中被引用为CodeBehind而不是CodeFile )。

后面的代码有两个文件,位于标记文件之间。例如,Default.aspx将有Default.aspx.cs和Default.aspx.designer.cs

如果在页面上放置按钮,则将其添加到设计器文件中。例如:受保护的global::System.Web.UI.WebControls.LinkButton LinkButton1;

如果希望获得对该控件的引用,则该控件立即可作为默认类的成员使用。例如:这个。LinkButton1.Text= "Click Me";

如果查看页面的跟踪,就会根据INamingContainers的行为(这里是页面)给出一个唯一的id :ctl00$ContentPlaceHolder1 1$LinkButton1 1

我不明白为什么语句返回null : Control = Page.FindControl("LinkButton1");

我意识到这是不必要的,因为默认类已经可以使用按钮了。这是因为它作为一个成员出现在Default.aspx.designer.cs文件中。

我不明白的是,为什么返回 null。因为页面实现了INamingContainer,并且按钮有一个ID,这个ID与INamingContainer中的控件的期望相关联。这不是FindControl发现的那种东西吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-17 08:15:45

这种行为对我来说是新的,也许是因为我不会试图寻找一个可以直接访问的控件。我认为这也可能是ASP.NET甚至不允许这样做的原因,因为使用现有引用比查找引用(或不使用引用)更快、更安全。

FindControl方法可用于访问在设计时ID不可用的控件。该方法只搜索页面的直接或顶层容器;它不递归地搜索页中包含的命名容器中的控件。若要访问从属命名容器中的控件,请调用该容器的FindControl方法。

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

编辑:在我检查了这个行为之后,我注意到只有在与MasterPage一起使用的页面上才返回null,因为页面的ControlCollection中唯一的控件是MasterPage本身。这事儿可以理解。当控件位于MasterPage页面的顶层时,您不能保证ID是唯一的,因为其他ContentPages可能也有一个带有此ID的控件,而FindControl今天可能会返回另一个控件,而不是明天。

如果您查看要查找的控件的NamingContainer,您会发现,对于MasterPage,它是ContentPlaceHolder,而对于“普通”页面,则是页面本身。

因此,您需要首先获得对MasterPage的ContentPlaceholder的引用,然后才能通过FindControl找到控件:

代码语言:javascript
复制
Page.Master.FindControl("ContentPlaceHolder1").FindControl("LinkButton1");

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

票数 3
EN

Stack Overflow用户

发布于 2011-11-17 08:09:34

FindControl不是递归的,看起来您有一个中间的ContentPlaceHolder1控件,它是一个命名容器,因此应该可以工作:Page.FindControl("ContentPlaceHolder1").FindControl("LinkButton1")

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8163846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档