2011-06-17 34 views
2

我有一個包含多個控件的頁面。找到在控件中有屬性的屬性

當頁面正在渲染時,我想遍歷頁面上的所有控件,並找到任何具有某個屬性屬性的控件。我試圖用c#來做到這一點 - 任何想法,我可能會實現這一點?

回答

1

我不知道你有多大的控制樹。這是我會做的。我沒有兌現最佳表現。

案例1.尋找.NET屬性

IEnumerable<Control> GetMarkedControls(ControlCollection controls) 
{ 
    foreach(Control c in controls) 
    { 
    var props = c.GetType().Properties(); 
    if(props.Count(x => x.GetCustomAttributes(false).OfType<YourAttribute>().Count() > 0) > 0) 
     yield return c; 

    foreach (Control ic in GetMarkedControls(c.Controls)) 
     yield return ic; 
    } 
} 

病例2尋找HTML屬性

IEnumerable<WebControl> GetMarkedControls(ControlCollection controls) 
{ 
    foreach(Control c in controls) 
    { 
    if(c is WebControl) 
    { 
     var wc = c as WebControl; 
     if (wc.Attributes.FirstOrDeafult(x => x.Name == "yourAttribute") != null) 
     yield return c; 
    } 

    foreach (Control ic in GetMarkedControls(c.Controls)) 
     yield return ic; 
    } 
} 

現在你可以這樣調用它:var controlsWAttribute = GetMarkedControls(this.Controls);從您的網頁或任何控制。這樣你就不必在頁面級調用它。

使用此方法,您可以遞歸地瀏覽頁面或控件中的整個控件樹。

0

是頁面上的每個控件都有它包含所有子控件的「控制」屬性。我已經編寫了遞歸函數來循環這些,但沒有任何手頭。讓我嘗試寫一個真正快速:

public Collection<Control> findControlsWithAttributes(Control startingControl) 
{ 
    Collection<Control> toReturn = new Collection<Control>(); 
    foreach (Control curControl in startingControl.controls) 
    { 
     if (DO COMPARISON HERE WITH CURCONTROL) toReturn.add(curControl); 
     if (curControl.Count() > 0) findControlsWithAttributes(curControl, toReturn); 
    } 
    return toReturn; 
} 

private void findControlsWithAttributes(Control startingControl, Collection<Control> inputCollection) 
{ 
    foreach (Control curControl in startingControl.controls) 
    { 
     if (DO COMPARISON HERE WITH CURCONTROL) inputCollection.add(curControl); 
     if (curControl.Count() > 0) findControlsWithAttributes(Control startingControl, Collection<Control> inputCollection); 
    } 
} 

它是一個小會兒,因爲我已經做到了這一點,我不記得了我的頭頂,如果Collection.Count是一個方法或屬性,以便使確保首先檢查,但如果你傳遞頁面,那麼這將檢查頁面上每個服務器可見的控件,並返回包含與您的比較匹配的控件的集合。

最後,Control.Attributes將返回一個AttributeCollection,您應該可以隨後進行比較。

0

不知道什麼屬性你後,但如果類的屬性是你是什麼樣的面貌@ user751975其他明智的,你可以這樣做後...

page.Controls.Cast<System.Web.UI.WebControls.WebControl>().First().Attributes["class"] 
相關問題