我想添加一个动态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
如何定位设计视图组件添加的目标吗?
答案 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);
但你不需要反思来实现你在这里寻找的东西。