【问题标题】:How do I use a variable within a control name? (C#)如何在控件名称中使用变量? (C#)
【发布时间】:2013-01-07 08:37:13
【问题描述】:

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

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} 不起作用,但有什么我可以用来完成这项工作的吗?

【问题讨论】:

  • FindControl()??你用的是哪个gui? (asp.net, winforms, wpf, silverlight, ...???)
  • 查找“C# 集合”。在一两个教程中享用咖啡(或其他合适的饮料)并考虑一下:new CheckBox[] { chk1, chk2 }

标签: c# variables loops if-statement for-loop


【解决方案1】:

最好创建 2 个大小相等的数组 - 一个用于保存复选框,一个用于保存标签。然后你的 for 循环将如下所示:

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

【讨论】:

    【解决方案2】:

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

    如果你不明白,请告诉我

    【讨论】:

      【解决方案3】:

      Dictionary 非常适合 CheckBox “绑定”到 Label 的 1:1 场景。在这里,CheckBox 充当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 等)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-09
        相关资源
        最近更新 更多