如何在控件名称中使用变量?(C#)

本文关键字:变量 控件 | 更新日期: 2023-09-27 17:50:49

我想把这段代码压缩成更简单的东西,这基本上是我写的代码,只是我把它缩短了很多。

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}不起作用,但我能用什么来实现这一点吗?

如何在控件名称中使用变量?(C#)

最好创建两个大小相等的数组,一个用来放置复选框,另一个用来存放标签。然后你的for循环将看起来像这样:

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

出于某种原因,我觉得这是一个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();
   }
}

如果你不了解的任何内容,请告诉我

Dictionary非常适合1:1的场景,其中CheckBox"绑定"到Label。这里,复选框充当KeyLabel充当Dictionary的值,可以对其进行强类型化,以确保在编译时处理正确类型的数据。

// 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等(