2011-03-14 64 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。

相關問題