通过反射获取Winform / UserControl中的所有复选框

时间:2013-09-09 06:52:52

标签: c# winforms reflection user-controls

我想添加一个动态CheckAll()方法来检查我班级中声明的所有复选框。

我尝试了以下代码:

class MyContol : UserControl
{
  ///
  ///  HIDDEN but there is plenty of checkboxes declaration
  ///

  private void CheckAll()
  {
    FieldInfo[] props = this.GetType().GetFields();

    foreach (FieldInfo p in props)
    {
      if (p.FieldType is CheckBox)
      {
         /// TODO: Check my box
      }
    }
  }
}

...但props为空。我不知道如何定位使用设计师部分制作的复选框。

您知道如何使用Reflection如何定位设计视图组件添加的目标吗?

2 个答案:

答案 0 :(得分:2)

控件的复选框应该都是子控件。也就是说,他们是Control.Controls集合中的孩子(或可能是孩子的孩子)。此外,控件不必将它们作为类的属性或字段引用。例如,我可以使用myControl.Controls.Add(new CheckBox())向现有控件添加复选框。因此,你不需要在这里反思,也不会真正得到你想要的东西 - 如果我正确理解你的话。

尝试以这种方式枚举它们(要检查面板中的示例控件,您需要进行递归搜索):

private void CheckAll(Control parent)
{
    foreach(Control c in parent.Controls)
    {
        if (c is CheckBox)
            Check((CheckBox)c);

        CheckAll(c);
    }
}

private void CheckAll()
{
    CheckAll(this);
}

答案 1 :(得分:1)

默认情况下,UserControl上的控件是私有字段,所以我猜你应该提供NonPublic标志作为GetFields方法中绑定属性的参数试试这个:

this.GetType().GetFields(System.Reflection.BindingFlags.NonPublic);

但你不需要反思来实现你在这里寻找的东西。

相关问题