我想仔细回答这个问题,这样有帮助的人就不会花时间告诉我我已经知道的信息(我不想浪费他们的时间)。
我想了解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发现的那种东西吗?
发布于 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找到控件:
Page.Master.FindControl("ContentPlaceHolder1").FindControl("LinkButton1");http://msdn.microsoft.com/en-us/library/xxwa0ff0.aspx
发布于 2011-11-17 08:09:34
FindControl不是递归的,看起来您有一个中间的ContentPlaceHolder1控件,它是一个命名容器,因此应该可以工作:Page.FindControl("ContentPlaceHolder1").FindControl("LinkButton1")
https://stackoverflow.com/questions/8163846
复制相似问题