1

文字列から派生したチェックボックス名でチェックボックス配列を埋めようとしています。次のコードを置き換えたいと思います。

    public void CheckBox_1()
    {
        CheckBox[] boxes_1 = new CheckBox[4];

        boxes_1[0] = A0;
        boxes_1[1] = A1;
        boxes_1[2] = A2;
        boxes_1[3] = A3;

        for (int i = 0;i < 4;i++)   
        {
            boxes_1[i].Enabled = checkBox1.Checked == true ? true : false;
        }
    }

このようなもので:

    public void CheckBox_1()
    {
        CheckBox[] boxes_1 = new CheckBox[4];

        for (int i = 0; i < 4; i++)
        {
            boxes_1[i] = ("A" + i);
        }

        for (int i = 0; i < 4; i++)
        {
            boxes_1[i].Enabled = checkBox1.Checked == true ? true : false;
        }
    }

チェックボックス名を簡単に文字列にすることはできますが、これを達成する方法は明確ではありません。ありがとう。

4

3 に答える 3

1

含まれているオブジェクトのControl.Controlsを使用して、すべてのCheckBoxコントロールを取得し、 「A」で始まる s をOfType<T>フィルター処理できます。Name

var container = ...control with the checkboxes...;

foreach(var cb in container.Controls.OfType<CheckBox>().Where(c => c.Name.StartsWith("A")))
{
   cb.Enabled = checkBox1.Checked;
}
于 2012-06-08T14:54:13.033 に答える
0

チェックボックスがいくつかの共通コンテナ内の他のコントロール内にネストできると仮定すると、これはうまくいくかもしれません:

    private void CheckBox_1()
    {
        foreach (var checkbox in FindChildren<CheckBox>(container, c => c.Name.StartsWith("A")))
        {
            checkbox.Enabled = checkBox1.Checked == true ? true : false;
        }
    }

    public static IEnumerable<T> FindChildren<T>(Control parent, Func<T, bool> filter)
        where T : Control
    {
        var search = new Stack<Control>();
        search.Push(parent);

        while (search.Count > 0)
        {
            parent = search.Pop();

            foreach (Control child in parent.Controls)
            {
                T typed = child as T;

                if (typed != null && filter(typed))
                {
                    yield return typed;
                    continue;
                }

                search.Push(child);
            }
        }
    }
于 2012-06-08T15:05:40.453 に答える
0

エラーが発生しやすく、理解しにくいコードを作成するためだけにリフレクションをいじる代わりに、関連するチェックボックスを のようなコンテナー コントロールにグループ化することをお勧めしますGroupBox

次に、非常に簡単で読みやすいです。

// consider renaming
public void CheckBox_1()
{
    var relatedCheckBoxes = GroupBox1.Controls.OfType<CheckBox>();
    foreach (var chk in relatedCheckBoxes)
        chk.Enabled = checkBox1.Checked; // you might want to pass this checkbox as argument instead
}
于 2012-06-08T14:54:40.323 に答える