2012-06-08 60 views
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; 
     } 
    } 

我能得到的复选框名称为一个字符串很容易,但目前还不清楚如何做到这一点。谢谢。

+0

把复选框在列表中会会更好。你这样做的方式需要反思。 – deltree

+0

你可以使用反射....但你应该澄清你的最终目标。也许我们将能够提供一个更好的方式来完成这项工作。 – ken2k

+1

相关复选框以某种方式组合在一起(f.e. GroupBox)? –

回答

1

可以使用包含对象的Control.Controls通过OfType<T>让所有的CheckBox控件,然后在Name s表示与“A”开始过滤。

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

foreach(var cb in container.Controls.OfType<CheckBox>().Where(c => c.Name.StartsWith("A"))) 
{ 
    cb.Enabled = checkBox1.Checked; 
} 
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 
} 
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); 
      } 
     } 
    }