0

このコードをもっと単純なものに圧縮したいと思います。かなり短くした以外は、基本的に私が書いたコードです。

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} は機能しませんが、これを機能させるために使用できるものはありますか?

4

3 に答える 3

0

何らかの理由で、これはWinFormsアプリだと感じています。間違っているかもしれませんが、将来的にはもっと明確にする必要があります。

各コントロールには親コントロールがあります。たとえば、すべてのコントロールが同じPanelコントロールに属している場合があります。これがこの例の場合であると仮定します。AControlには、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();
   }
}

わからないことがあれば教えてください

于 2013-01-07T08:49:15.113 に答える
0

2つの同じサイズの配列を作成することをお勧めします。1つはチェックボックスを保持し、もう1つはラベルを保持します。次に、forループは次のようになります。

for (int i = 0; i < 7; i++)
{
    if (checkBoxes[i].Checked == false)
    {
        labels[i].Text = rng.Next(1, 7).ToString();
    }
}
于 2013-01-07T08:49:25.973 に答える
0

aは、 a が aに「バインド」されてDictionaryいる 1:1 のシナリオにうまく適合します。ここで、CheckBox は として機能し、は の値として機能します。コンパイル時に正しい型のデータを確実に処理できるように厳密に型指定できます。CheckBoxLabelKeyLabelDictionary

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

(*): コードを読むとロジックが理解しやすいので、常に条件の真偽を確認することをお勧めしますが、動作は最終的にまったく同じです。

注: このコードはどこでも動作するはずです (WinForms、WPF、Silverlight など)。

于 2013-01-07T09:01:23.997 に答える