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

The checkboxes of the control should all be child controls. That is, they are children (or possibly children of children) in the Control.Controls collection. Furthermore, controls do not have to have a reference to them as a property or field of the class. For example, I can add a checkbox to an existing control with myControl.Controls.Add(new CheckBox()). Therefore you do not need reflection here, nor will it really get you what you want - if I'm understanding you correctly.

Try enumerating them this way (to check for example controls in a panel you will need to do the recursive search):

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 のコントロールはプライベート フィールドであるため、GetFields メソッドで属性をバインドするためのパラメーターとして NonPublic フラグを指定する必要があると思います。これを試してください。

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

ただし、ここで探しているものを達成するためにリフレクションは必要ありません。

于 2013-09-09T07:00:25.727 に答える