【问题标题】:Get all Checkboxes in Winform / UserControl by reflection通过反射获取Winform/UserControl中的所有复选框
【发布时间】:2013-09-10 12:08:28
【问题描述】:

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

【问题讨论】:

  • 我用this
  • @Sayse,很有趣。

标签: c# winforms reflection user-controls


【解决方案1】:

控件的复选框应该都是子控件。也就是说,它们是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);
}

【讨论】:

  • CheckAll(c); 替换CheckAll(c.Controls); 工作正常
【解决方案2】:

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

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

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

【讨论】:

  • 我明白了,但最后我更喜欢 lc. 介绍的解决方案,正如你所说的没有Reflection
猜你喜欢
  • 1970-01-01
  • 2014-08-27
  • 2016-09-20
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
相关资源
最近更新 更多