【问题标题】:C# loop through an array of given labelsC# 循环遍历给定标签的数组
【发布时间】:2011-12-09 03:40:37
【问题描述】:

这对我来说有点难以描述,但是这个伪 C# 应该可以解释我想要做什么。

windows窗体上有大量的标签。

我想更改其中一些标签的文本颜色。

private void allBlackLabels()
{
    int[] lray = { 1, 2, 3, 5, 6 };
    foreach (int i in lray)
    {
        label[i].Forecolor = Color.Black;
    }            
}

我希望这能解释我在这里想要做什么。

现在很明显,由于标签[i],它不会工作,但我该如何解决这个问题?

【问题讨论】:

  • 为什么它“显然由于标签[i]而无法工作”?我们是否应该假设您目前无法方便地使用您的标签?这里真正的问题是“我如何从表单中获取所有标签,并以label17 形式的名称键入?” ?

标签: c# arrays winforms labels


【解决方案1】:

它可能不起作用,因为您的标签未保存在数组中。考虑到您知道要更改的标签名称,以下代码将起作用:

Label[] lray = { labelOne, labelDifferent, labelWhatElse };
foreach (Label label in lray)
{
    label.ForeColor = Color.Black;
}            

【讨论】:

  • 这太完美了,谢谢!为什么我要走我永远不会知道的路线!谢谢先生。
【解决方案2】:

如果你真的一个标签数组,那会很好用。

如果你只有很多变量,像这样:

private Label label1;
private Label label2;
private Label label3;
private Label label4;
private Label label5;

那就更难了。选项:

  • 更改代码以改用数组。设计师没有那么好,但更合乎逻辑
  • 对每个 ID 使用 Controls.Find
  • 遍历Controls 以查找所有 Label 控件,无论名称如何

【讨论】:

    【解决方案3】:
    foreach (Control c in this.Controls)
    {
        if (c is Label)
        {
            // do stuff
        }
    }
    

    这将获取表单的所有子控件(前提是此代码在表单的代码隐藏中)并检查它们是否为标签。只需执行您想要的任何操作来代替评论即可。

    【讨论】:

    • 我个人会在那里使用 LINQ:foreach (Label label in this.Controls.OfType<Label>())
    • 但这会改变所有标签,而tripbrock只想改变其中的一部分。
    【解决方案4】:

    您可以自己创建数组。每次您的表单更改时,这都会涉及一些维护成本/风险。注意:您可能希望将数组创建位放在 Form Loaded 事件中,而不是在构造函数中,或者至少在 InitializeComponent 调用之后,以便设置您的控件。

    或者您可以迭代表单的所有子项(来自 Form 方法的this.Controls),使用特定标签标记您的标签,或者如果这是您的目的,则获取所有标签。

    请注意,如果表单中有许多控件,第一个解决方案在运行时性能方面可能要快得多。

    【讨论】:

    • 如果您在设计器中为标签提供相同的名称,它会为您创建一个数组——那么就没有真正的机会弄错了。 编辑:嗯,至少你曾经能够做到。
    • @KristianFenn 有趣。不过,这可能涵盖也可能不涵盖 OP 的用例。例如,根据某些运行时属性,他可能有两组不同的标签。
    【解决方案5】:
    private void allBlackLabels()
    {
        int[] lray = { 1, 2, 3, 5, 6 };
        foreach (int i = 0; i < lray.Length; i++)
        {
            ((Label)this.Controls["label" + i]).ForeColor = Color.Black;
        }            
    }
    

    【讨论】:

      【解决方案6】:

      如果您想为表单上的所有标签实现这一点,那么这样的事情可能会有所帮助:

      foreach (Control control in this.Controls) {
           if (control is Label) {
               (control as Label).Forecolor = Color.Black;
           }
      }
      

      但是,如果您只需要更改所有标签的子集,那么您需要存储需要更改的标签的名称或索引。这是因为this.Controls 有两个索引器,一个 int32 和一个字符串。因此你可以尝试这样的事情

      private void allBlackLabels()
      {
          int[] lray = { 1, 2, 3, 5, 6 };
          foreach (int i in lray)
          {
               this.Controls[i].Forecolor = Color.Black;
          }            
      }
      

      值得注意的是,this.Controls 中的排序很可能不像 lray 数组那样线性。 希望这会有所帮助

      【讨论】:

      • 希望所有控件都直接在最外层的控件/表单上,而不是嵌套...
      【解决方案7】:

      试试这样的:

      List<string> ListLabelNames = new List<string>() { /* Your label name list*/ };
      
      foreach (Label TmpLabel in this.Controls.OfType<Label>())
      {
          foreach (string strTmp in ListLabelNames)
          {
              if (String.Compare(TmpLabel.Name, strTmp, true) == 0)
                  TmpLabel.ForeColor = System.Drawing.Color.Black;
          }
      }
      

      希望这会有所帮助。

      【讨论】:

        【解决方案8】:

        我注意到您在示例中从“lray”数组中排除了 4。如果您希望排除一个或多个标签不被代码自动更新(可能突出显示一组中的一个),试试这个。

            private void allBlackLabels()
            {    
                foreach (Control control in this.Controls)            
                {
                    if (control is Label && control.Name != "label4")
                    {
                        (control as Label).Forecolor = Color.Black;
                    }
                }
            }
        

        【讨论】:

          【解决方案9】:

          在伪 C# 中:

          List<String> controlsToChange =new List<String>{"lable1Name","lable2Name"};
          foreach(Control control in form.Controls)
          {
              if(control.GetType().Equals(typeof(Lable))
              {
                   if( controlsToChange.Contains(control.Name)
                   {
                        control.Forecolor=Colour.Black;
                   }
              }
          }
          

          【讨论】:

          • 但这会改变所有标签,而tripbrock只想改变其中的一部分。
          • @Fischermaen,真的吗?还是只会更改在 controlsToChange 列表中有条目的那些?
          • 不,它只会改变List中指定的标签。
          • @SamHolder:你是对的。对不起!如果你有一个 List
          • @Fischermaen 确实你是对的,你可以保存测试。您可以删除否决票吗?
          猜你喜欢
          • 1970-01-01
          • 2011-01-25
          • 1970-01-01
          • 1970-01-01
          • 2018-10-22
          • 1970-01-01
          • 1970-01-01
          • 2013-05-15
          • 1970-01-01
          相关资源
          最近更新 更多