2015-05-28 69 views
0

我想從任何ControlCollection獲取所有相應類型的控件。重要的是要知道,我將一些元數據存儲在標記控件的屬性中。 這裏是我的發現返回的控制相應的T型方法:如何從Panel中獲取所有按鈕(或任何其他類型)?

public static void GetAllChildControls<T>(Control.ControlCollection root, List<T> list) where T : Control { 
    if (list == null) 
    list = new List<T>(); 
    foreach (Control ctl in root) { 
    if (ctl.GetType() == typeof(T)) 
     list.Add((T)ctl); 
    if (ctl.Controls.Count > 0) 
     GetAllChildControls(ctl.Controls, list); 
    } 
} 

爲什麼我寫這篇文章的唯一原因是因爲我不爲標籤找回價值。在VS2008中,(T)ctl沒有可評估的標籤(以及ContextMenu)。它顯示「無法評估表達式」。否則,所有其他的事情似乎是確定的。

UPDATE

,我要問標籤屬性的代碼:

... 
List<Button> list = null; 
Helper.GetAllChildControls<Button>(master.ChildControls, list); 
if (list != null) 
    foreach (CounterItem c in counters) { 
    Button b = list.Single(e => e.Tag.Equals(c.Name)); 
            ^^^ 
    if (b == null) 
     continue; 
    b.SetCounter(c.Value); 
    } 
... 
+0

後,你用做標記屬性 –

+0

@ E-蝙蝠的代碼,後已更新 – Franziee

+0

什麼是行爲/錯誤你得到了什麼? – cdkMoose

回答

1

調用方法的方式從來都不會產生任何結果:

List<Button> list = null; 
Helper.GetAllChildControls<Button>(master.ChildControls, list); 
.... 
public static void GetAllChildControls<T>(Control.ControlCollection root, List<T> list) where T : Control 
{ 
    if (list == null) 
     list = new List<T>(); 

既然你'不傳遞參數爲ref List<T> listlist在該方法的範圍內將被創建,但list在調用者的範圍內仍將是null

如果我是你,我會想辦法讓GetAllChildControls<T>返回一個列表:

public static List<T> GetAllChildControls<T>(Control.ControlCollection root) where ... 
+0

不要以爲你想要它返回列表

+0

@cdkMoose好的一個,我一味地複製粘貼...編輯 –

+0

我已經添加_ref_在列表中的實時代碼,但它沒有關係,標籤仍然是「無法評估表達式」... – Franziee

相關問題