给定某个文件中的控件SomeControl
的实例(可能是usercontrol / ascx或aspx),如何获取它所属的类的引用?
在用户控件中,SomeControl.NamingContainer
似乎是可靠的。
在继承自MasterPage的页面中,这将返回对ContentPlaceHolder
的引用,而不是定义aspx的实际类。在这种情况下我想要的是SomeControl.Page
Parent
将返回heirarchy中的父控件,因此没有多大用处。
有什么方法可以直接得到它,无论它是什么类型的东西?
答案 0 :(得分:0)
您需要区分成为类的成员,以及作为页面上的可寻址控件。有一个区别 - 一个是面向对象编程语言的属性,另一个是添加到ASP.NET的WebForms实现的构造。
将控件添加到default.aspx会将该控件添加到页面的Controls集合中。然后,设计者会自动将引用添加到页面类,只要相关控件未包含在另一个控件模板中(或者该模板被标记为InstanceTemplate,如ContentPlaceholder)。该引用基本上是围绕Page.FindControl的快捷方式。
控件的NamingContainer是第一个通过实现INamingContainer接口来负责确保其内部控件唯一性的ParentControl。
听起来你要做的就是找到与控件相关的页面?为此,您需要遍历控制树(遵循每个控件上的.Parent属性),检查父级是否为Page类型。
答案 1 :(得分:0)
您必须以递归方式使用Parent属性:
public Control GetParent(Control ctl)
{
Control parent = ctl.Parent;
while (parent != null)
{
if (parent is UserControl || parent is Page)
return parent;
parent = parent.Parent;
}
return ctl.Page;
}
这样的事情。这是识别控件的父容器的唯一方法,无论是在UC还是Page中。控件只能识别页面,而不能识别它所属的用户控件,除非通过Parent属性。
HTH。