1

我想添加一个动态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如何使用设计视图组件添加目标吗?

4

2 回答 2

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);
}
于 2013-09-09T06:57:05.873 回答
1

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

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

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

于 2013-09-09T07:00:25.727 回答