【问题标题】:How to change all label forecolor with a click of a button如何通过单击按钮更改所有标签前景色
【发布时间】:2016-04-04 12:06:35
【问题描述】:

我想创建一个按钮,通过单击按钮来更改标签的前景色。但是每当我单击按钮时,它只会更改不在面板中的标签的前景色。 这是我的代码:

private void button1_Click(object sender, EventArgs e)
{
    this.BackColor = Color.White;
    foreach(Control l in Controls)
    {
        if(l is Label)
        {
            l.ForeColor = Color.Black;
        }           
    }
}

我尝试过使用

private void button1_Click(object sender, EventArgs e)
{
    this.BackColor = Color.White;
    foreach(Label l in Controls)
    {                
        l.ForeColor = Color.Black;
    }
}

但它给了我一个错误,说它无法将System.Windows.Forms.Panel 类型的对象转换为System.Windows.Forms.Label 类型。

【问题讨论】:

    标签: c# winforms button label


    【解决方案1】:

    您可以使用 Linq 过滤控件:

    foreach (Label l in Controls.OfType<Label>())
    {
        l.ForeColor = Color.Black;
    }
    

    编辑:

    如果你有更深层次的控制,你可以递归:

    private void SetLabelBlack(Control ctrl)
    {
        foreach (Control c in ctrl.Controls)
        {
            Label l = c as Label;
            if (l != null)
            {
                l.ForeColor = Color.Black;
            }
            else
            {
                SetLabelBlack(c);
            }
        }
    }
    

    然后这样称呼它:

    SetLabelBlack(this);
    

    【讨论】:

      【解决方案2】:

      你不能这样做

      foreach(Label l in Controls)
      

      因为并非Controls 中的所有Control 都属于Label 类型

      使用 LINQ 实现

      foreach(Label l in panel.Controls.OfType<Label>())
          l.ForeColor = Color.Black
      

      这样,您首先会选择性地只从Controls 中获取Label 类型的Control

      编辑:

      如果您在一个表单中有多个面板,并且您想更改所有面板内标签的所有颜色,则可以进行多次循环

      foreach(Panel p in Controls.OfType<Panel>())
          foreach(Label l in p.Controls.OfType<Label>())    
              l.ForeColor = Color.Black;
      

      如果您有一些不在面板中但在表单中的Labels,您可以将上述内容与

      foreach(Label l in Controls.OfType<Label>())    
          l.ForeColor = Color.Black;
      

      【讨论】:

      • 但此代码仅帮助我更改不在面板中的标签的前景色
      • @Kenneth 您可以通过控制面板来更改面板中的标签。查看我的更新答案
      • @Kenneth 我更新了我的答案,请将我的代码中的 panel 替换为您的 panel 对象名称
      • 因此,我需要使用此代码指定我拥有的每个面板
      • @Kenneth 太棒了!是的,你可以这样做,或者你也可以进行递归搜索。但关键是OfType&lt;Panel&gt;OfType&lt;Label&gt;。一旦你知道这一点,其余的几乎都是可调的。 ;)
      【解决方案3】:

      正如错误提示你必须检查它的类型!

      private void button1_Click(object sender, EventArgs e)
      {
      this.BackColor = Color.White;
      foreach(Control l in Controls)
      {
          if(l.GetType()==typeof(System.Windows.Forms.Label))
          {
              l.ForeColor = Color.Black;
          }           
      }
      }
      

      【讨论】:

        【解决方案4】:

        在列表(列表)中添加您要更新的所有标签。然后遍历该列表中的所有标签并更新前景色。 panel.Controls 仅返回该面板中的控件,因此如果您要更新的标签不在该面板中,则 panel.Controls 将不起作用,而且它仅迭代该面板的直接子项。在面板中,您可以拥有另一个面板,其中包含面板等...

        【讨论】:

          【解决方案5】:
          foreach(Control c in this.Controls)
                          {
                              if(c is Label)
                              {
                                  Label b = c as Label;
                                  b.ForeColor = Color.White;
                              }
                          }
          

          【讨论】:

          • 尽管此代码可能(或可能不会)解决问题,但好的答案应该始终解释代码的作用和帮助。
          猜你喜欢
          • 2018-01-06
          • 2021-11-16
          • 2018-11-27
          • 2017-01-10
          • 2021-08-06
          • 2016-04-05
          • 2017-11-04
          • 1970-01-01
          • 2019-12-03
          相关资源
          最近更新 更多