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 个大小相等的数组 - 一个用于保存复选框,一个用于保存标签。然后你的 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被“绑定”到 aDictionary的 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 回答