【问题标题】:How to change BackColor of all my Panel in my Form如何在我的表单中更改所有面板的背景色
【发布时间】:2019-09-19 21:05:59
【问题描述】:

我的工具需要帮助。 我尝试将 Color 我的 Panel 更改为 ColorDialog 但是,它不起作用 我想在我的Form 中更改所有Panel 的颜色。 面板构造器:

Panel p = new Panel();

事件处理程序:

private void button104_Click_1(object sender, EventArgs e)
{
   this.bg.FullOpen = true;
   if (this.bg.ShowDialog() == DialogResult.OK)
   {
      this.setBgColor(this.bg.Color);
   }
}

public void setBgColor(Color rgb)
{
   p.BackColor = rgb;
}

【问题讨论】:

  • WPF、Win Forms、Xamarin,还有别的吗?
  • @RandyRetro's 你没有发布你的代码截图,我们有一个代码块,请使用它们。
  • @RandyRetro 欢迎使用 Stack Overflow。请不要发布代码截图。您可以编辑您的问题并向其添加更多文本。这个网站很好地处理了源代码,每个人都更容易阅读或复制,如果他们想自己测试它,以便他们可以帮助你。
  • @MongZhu 确实如此,但如果你想创造最好的东西,那就选择新的东西,他大概正在尝试这样做。我可以编写一些 C++ 和相当不错的 C# 我可以使用什么? FoxPro,您绝对不能选择使用什么。但在你休息的时候,你可以玩得开心。
  • 即使是遗留系统也会在某个时候向前发展到最新的环境,如果您已经掌握了专有技术,您可以获得一些甜美的声誉和额外的欧元。

标签: c# winforms


【解决方案1】:

您可以使用System.Linq扩展方法OfType选择特定类型的所有控件,如果您在循环中迭代它们,您可以设置它们的所有BackColor属性:

private void button1_Click(object sender, EventArgs e)
{
    ColorDialog cd = new ColorDialog();

    if (cd.ShowDialog() == DialogResult.OK)
    {
        foreach (var panel in Controls.OfType<Panel>())
        {
            panel.BackColor = cd.Color;
        }
    }
}

请注意,这只遍历直接属于表单本身的控件。如果任何面板位于容器控件内,那么我们将需要查看每个控件以查看它是否包含任何面板。

我们可以为此编写一个辅助方法,它接受一个Control 来检查,一个Color 用于BackColor,以及一个Type,它指定我们想要设置的控件类型颜色。

然后我们首先检查Control 是否与我们要查找的类型相同,如果是,则将其设置为背景色。之后,我们循环遍历它的所有子节点并再次递归调用它们的方法。这样,如果我们将父表单作为Control 传递,我们将遍历所有控件:

private void SetBackColorIncludingChildren(Control parent, Color backColor, Type controlType)
{
    if (parent.GetType() == controlType)
    {
        parent.BackColor = backColor;
    }

    foreach(Control child in parent.Controls)
    {
        SetBackColorIncludingChildren(child, backColor, controlType);
    }
}

private void button1_Click(object sender, EventArgs e)
{
    ColorDialog cd = new ColorDialog();

    if (cd.ShowDialog() == DialogResult.OK)
    {
        // Pass 'this' to the method, which represents this 'Form' control
        SetBackColorIncludingChildren(this, cd.Color, typeof(Panel));
    }
}

【讨论】:

  • 很好,一边回答问题一边教一些LINQ和好习惯!
【解决方案2】:

你可以用这个:

private void button1_Click(object sender, EventArgs e)
{
  this.bg.FullOpen = true;
  if ( this.bg.ShowDialog() == DialogResult.OK )
  {
    setBgColor(Controls, bg.Color);
  }
}

public void setBgColor(Control.ControlCollection controls, Color rgb)
{
  foreach ( Control control in controls )
  {
    if ( control is Panel )
      ( (Panel)control ).BackColor = rgb;
    setBgColor(control.Controls, rgb);
  }
}

它解析表单的所有控件,并递归地解析控件的所有控件。

然后窗体的所有面板的颜色都改变了,所有“根”面板和面板中的面板中的所有面板...

【讨论】:

  • 为什么可以解析所有控件,如果他已经有引用,一切都很好......
  • 改变表单中所有Panel的backcolor,包括panels中的panel等等,或者我没看懂问题。
  • 赞成,因为我忘记考虑嵌套控件,并认为所有控件都可以在表单本身的 Controls 数组中使用。 (在我的辩护中,几年来没有做过winforms)
【解决方案3】:

这个看起来像winforms。假设是这种情况,您需要遍历表单上的所有控件,并为每个 Panel 设置其颜色。

类似这样的东西(未经测试,你可能需要玩一下)

public void setBgColor(Color rgb)
{
    foreach (Control c in this.Controls)
    {
        if (c.GetType() == typeof(System.Windows.Forms.Panel))
        {
            c.BackColor = rgb;
        }
    }
}

【讨论】:

  • 没问题 - 如果这有助于随时接受答案:)
  • 我有最后一个问题,我在 MetroTabPage 中也有面板,他不想改变颜色
  • @RandyRetro's 如果它不是同一类型的控件,则扩展代码以检查其他类型(例如 else if (c.GetType() == typeof(MetroControls.MetroPanel)) 或类似的。我不熟悉 Metro 控件,但只是有一个非常快地摆弄它们,我什至不知道如何让 MetroPanel 显示不同的背景颜色 - 如果我只是在设计器中设置它,它似乎并没有改变;也许这就是问题所在?
  • 我建议采用上述 Olivier Rogier 的解决方案 - 这可能会很好地解决您的问题。
  • 我的面板在 MetroTabPage1 中,我的面板是 System.Windows.Form
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
相关资源
最近更新 更多