如何从Panel中获取所有按钮(或任何其他类型)?

时间:2015-05-28 12:05:01

标签: winforms .net-3.5 compact-framework

我想从任何ControlCollection中获取所有相应类型的控件。重要的是要知道,我将一些元数据存储在控件的 Tag 属性中。 这是我获取相应T类控件的方法:

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);
  }
}

我写这篇文章的唯一原因是因为我没有收回 Tag 的值。在VS2008中,(T)ctl 没有可评估的Tag(以及ContextMenu)。它显示“无法评估表达式”。否则所有其他事情似乎都没问题。

更新

我要求Tag属性的代码:

...
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);
  }
...

1 个答案:

答案 0 :(得分: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> list传递,因此将创建方法范围内的list,但list 的范围为来电者仍为null

如果我是你,我会让GetAllChildControls<T>返回一个列表:

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