2012-06-08 65 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); 
      } 
     } 
    }