2012-06-08 2 views
1

문자열에서 파생 된 확인란 이름으로 확인란 배열을 채우려고합니다.문자열에서 체크 박스 배열 이름을 채우십시오.

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; 
     } 
    } 

내가 충분히 쉽게 문자열에있는 확인란의 이름을 얻을 수 있지만,이 작업을 수행하는 방법을 분명하지 않다 :이 같은 뭔가

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; 
     } 
    } 

: 나는 다음과 같은 코드를 대체하고 싶습니다. 감사.

+0

을 목록에서 체크 박스를 넣는 것 나아지 다. 당신이하고있는 방식은 반영이 필요합니다. – deltree

+0

반성을 사용할 수는 있지만 최종 목표는 분명히해야합니다. 어쩌면 우리는 더 나은 방법으로 일할 수있을 것입니다. – ken2k

+1

관련 확인란이 어떻게 그룹화되어 있습니까 (예 : GroupBox)? –

답변

1

당신은 OfType<T>를 통해 모든 CheckBox 컨트롤을 얻을 후 "A"로 시작하는 Name의 필터링을 포함하는 객체의 Control.Controls를 사용할 수 있습니다.

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); 
      } 
     } 
    }