asp.net 查找控件和查找容器

xdnvmnnf  于 2022-12-15  发布在  .NET
关注(0)|答案(3)|浏览(169)

我想仔细地表达这个问题,这样乐于助人的人就不会跳出来花时间告诉我我已经知道的信息(我不想浪费他们的时间)。
我想了解FindControl在ASP.NET Web应用程序项目中是如何工作的(在标记中,C#文件被引用为CodeBehind,而不是CodeFile)。
后置程式码有两个位于标记档之间的档案。例如,Default.aspx会有Default.aspx.cs和Default.aspx.designer.cs
如果将按钮放在页上,则该按钮将添加到设计器文件中。例如:受保护的全局变量::系统.Web.用户界面. Web控件.链接按钮链接按钮1;
如果你想得到一个对那个控件的引用,它可以立即作为Default类的一个成员使用。例如this.LinkButton1.Text =“Click Me”;
如果您查看页面的跟踪,它会根据INamingContainers(这里是Page)的行为被赋予一个唯一的id:ctl00 $内容占位符1 $链接按钮1
我不明白的是为什么语句返回null:控件c =页面.查找控件(“链接按钮1”);
我意识到这是不必要的,因为按钮已经对Default类可用,这是因为它在Default.aspx.designer.cs文件中显示为成员。
我不明白的是***为什么返回***null。因为Page实现了INamingContainer,并且按钮的ID与INamingContainer中控件的预期ID相关。这不正是FindControl所找到的吗?

sirbozc5

sirbozc51#

这种行为对我来说是新的,可能是因为我不会尝试搜索一个可以直接访问的控件。我想这也可能是ASP.NET甚至不允许这样做的原因,因为使用一个现有的引用比找到它(或不找到)更快更安全。
FindControl方法可用于访问其ID在设计时不可用的控件。该方法只搜索页的直接容器或顶级容器;它不会递归搜索页上包含的命名容器中的控件。若要访问从属命名容器中的控件,请调用该容器的FindControl方法。
http://msdn.microsoft.com/en-us/library/31hxzsdw.aspx

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

如果您查看要查找的控件的NamingContainer,您会发现如果是MasterPage,则为ContentPlaceHolder;如果是“普通”页面,则为页面本身。
因此,在通过FindControl找到控件之前,您需要首先获取对母版页的ContentPlaceholder的引用:

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

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

tpgth1q7

tpgth1q72#

FindControl不是递归的,而且看起来您有一个中间的ContentPlaceHolder1控件,它是一个命名容器,所以应该可以这样做:Page.FindControl("ContentPlaceHolder1").FindControl("LinkButton1")

mrfwxfqh

mrfwxfqh3#

如果您将其放在Panel中,您可以调用

myPanel.FindControl("LinkButton1");

相关问题