2013-01-07 2 views
0

이 코드를 훨씬 더 간단하게 압축하고 싶습니다. 여기에는 기본적으로 내가 작성한 코드가 있습니다. 단, 꽤 많이 단축했습니다.컨트롤 이름에서 변수를 사용하려면 어떻게해야합니까? (C#)

if (chk1.Checked != true) lab1.Text = rng.Next(1, 7).ToString(); 
if (chk2.Checked != true) lab2.Text = rng.Next(1, 7).ToString(); 

매우 유사한 여러 줄 대신, 한 줄에 몇 줄을 입력하고 싶습니다. 'for'루프를 시도했지만 컨트롤 이름의 내부 변수를 어떻게 사용할 수 있는지 알지 못합니다.

for (int x = 1; x == 7; x++) 
{ 
    if (chk{x}.Checked != true) lab{x}.Text = rng.Next(1, 7).ToString(); 
} 

분명히 {x}은 작동하지 않지만이 작업을 수행하는 데 사용할 수있는 것이 있습니까?

+0

'의 FindControl()'?? 어떤 GUI를 사용하고 있습니까? (asp.net, winforms, wpf, silverlight, ... ???) –

+7

"C# Collections"를 찾으십시오. 튜토리얼 2 개 이상에서 커피 (또는 다른 적당한 음료)를 즐기고 이것을 고려하십시오 :'새로운 CheckBox [] {chk1, chk2}'. –

답변

0

두 개의 같은 크기의 배열 - 하나는 확인란을 유지하고 다른 하나는 레이블을 유지하는 것이 가장 좋습니다. 그런 다음에 대한 루프는 다음과 같이됩니다하십시오 CheckBoxLabel에 "바인딩"1 시나리오 :

for (int i = 0; i < 7; i++) 
{ 
    if (checkBoxes[i].Checked == false) 
    { 
     labels[i].Text = rng.Next(1, 7).ToString(); 
    } 
} 
0

나는 이것이 WinForms 응용 프로그램이라고 느낀다. 나는 틀릴 수도 있지만 앞으로는 더 명확해질 필요가있다.

각 컨트롤에는 부모 컨트롤이 있습니다. 예를 들어 모든 컨트롤은 동일한 Panel 컨트롤에 속할 수 있습니다. 나는 이것이이 예에 해당한다고 가정 할 것이다. Control은 자식 컨트롤 모음 인 Controls 속성을 가지며 컨트롤 이름을 사용하여 액세스 할 수 있습니다. 그래서 당신은 당신의 컨트롤이 변수 위와 동일한 이름이 가정 (디자이너, 또는 Name 특성을 사용하여 이름), 당신은 ... 이런 식으로 뭔가를 할 수

for(int i = 1; i <= 7; i++) 
{ 
    Checkbox checkbox = MyParentPanel.Controls["chk" + i] as Checkbox; 
    Label label = MyParentPanel.Controls["lab" + i] as Label; 
    if(checkbox != null && label != null && !checkbox.Checked) 
    { 
     label.Text = rng.Next(1, 7).ToString(); 
    } 
} 

당신이 '돈 알려줘 그 중 하나를 이해하십시오

0

Dictionary은 1에 잘 맞는 것입니다. 여기에서 CheckBox는 Key으로 작동하고 LabelDictionary의 값으로 작동하며, 강력한 형식으로 컴파일 할 때 올바른 유형의 데이터를 처리 할 수 ​​있습니다.

// Declare this at class level 
private Dictionary<CheckBox, Label> myControls = new Dictionary<CheckBox, Label>(); 
// ... 

// Dictionary initialization goes in the ctor 
// unless you generate the controls at run-time. 
// If you generate controls, place it after the generation itself 
myControls.Add(chk1, lab1); 
myControls.Add(chk2, lab2); 
// and so on... 

// ...  

// When you want to cycle, do this: 
foreach(var controlsPair in myControls) { 
    // controlsPair is KeyValuePair<CheckBox, Label> 
    if(controlsPair.Key.Checked) continue; // SEE (*) BELOW 

    controlsPair.Value.Text = rng.Next(1, 7).ToString(); 
} 

(*) : 나는 항상 내가 코드를 읽을 때 쉽게 논리가 이해하기 찾을 수 있기 때문에 조건의 진위를 확인하는 것이 좋습니다,하지만 행동이 정확히 결국 동일합니다.

참고 :이 코드는 사방 (윈폼 등 WPF, Silverlight를) 작업을해야

관련 문제