2011-03-14 60 views
1

给定某个文件(可以是usercontrol/ascx或aspx)的控件SomeControl的实例如何获取引用到它所属的班级?给定一个成员对象获取对当前类(ascx或aspx)的引用

在用户控件中,SomeControl.NamingContainer似乎是可靠的。

在从一个母版继承了一个页面,这将参考返回ContentPlaceHolder,而不是实际的类定义的aspx。我想在这种情况下是SomeControl.Page

Parent将在heirarchy返回父控制,所以没有太大的用处。

有没有什么方法可以直接得到这个,不管它是什么类型的东西?

+1

你是指“参考它所属的类”是什么意思?给你一些细节,你想做什么,为什么你需要它会有所帮助,我不太关注... – 2011-03-14 18:34:32

+0

每个控件都是一个类的成员。当你在'default.aspx'中创建一个控制'SomeControl'时,它就成为'default'类的成员,例如'default.SomeControl'。给定'SomeControl'我想引用'default'。 – 2011-03-14 18:59:56

回答

0

您需要区分是否是类的成员,并且是页面上的可寻址控件。有一个区别 - 一个是面向对象编程语言的属性,另一个是添加到ASP.NET的WebForms实现中的构造。

将控件添加到default.aspx会将该控件添加到页面的Controls集合中。只要相关控件未包含在其他控件模板中(或者该模板被标记为InstanceTemplate,就像ContentPlaceholder一样),设计人员就会自动将该引用添加到页面类中。该引用基本上是一个围绕Page.FindControl的快捷方式。

通过实现INamingContainer接口,控件的NamingContainer是第一个负责确保其内部控件的唯一性的ParentControl。

这听起来像你想要做的是找到一个控制与关联的页面?为此,您需要遍历控件树(按照每个控件的.Parent属性),检查父类型是否为Page类型。

+0

对不起 - 我不完全清楚。所讨论的对象将总是*成为类的成员,而不是动态地添加到控制树中的东西。 'Page'不够好,因为如果它是一个usercontrol,我想要定义usercontrol的类,而不是页面。 (userControl中的控件不是Page类的成员,它是usercontrol类的成员)。 – 2011-03-14 19:30:55

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。