C# 无法遍历控件集合并在 Windows 表单中的用户控件上设置属性

C# Unable to loop through control collection and set properties on a user control in Windows Forms

您好,我有一个 Forms 应用程序,它使用基于名为 colorSlider 的跟踪栏的自定义控件。该控件是从代码项目中获取的,并添加到VS2017中的工具中。控制工作的各个方面都很好。我可以根据需要更改任何属性。然而,最终项目相当大,所有的轨道栏(50 个左右)都将被这个自定义控件替换。我还希望能够使用用户自定义皮肤修改滑块的外观。 所以,这是一个典型的命令来改变滑块上的按钮。

colorSlider1.ThumbInnerColor = Color.FromArgb(99, 130, 208);

而且这工作得很好。但是我想循环执行此操作。所有控件都位于称为背板的面板上。下面是一个改变按钮前景色的例子:

        foreach (Panel pnl in backPanel.Controls)
        {
            foreach (Control c in pnl.Controls)
            {
                if (c is Button)
                {
                    c.ForeColor = Color.Black;
                }
            }
        }

效果很好。但是,如果我尝试这样做:

        foreach (Panel pnl in backPanel.Controls)
        {
            foreach (Control c in pnl.Controls)
            {
                if (c is ColorSlider.ColorSlider)
                {
                    c.ThumbInnerColor = Color.FromArgb(99, 130, 208);
                }
            }
        }

在这种情况下visual studio给出语法错误

错误 CS1061 'Control' 不包含 'ThumbInnerColor' 的定义,并且找不到接受类型 'Control' 的第一个参数的可访问扩展方法 'ThumbInnerColor'(您是缺少 using 指令或程序集引用?)

有人知道如何解决这个问题吗? 谢谢

看看错误.. Control' 不包含 'ThumbInnerColor' 的定义..这是真的.. Control 不包含 属性 . 现在看看你的代码:

c.ThumbInnerColor = Color.FromArgb(99, 130, 208);

您正在尝试在类型为 ControlObject 上设置 属性。 属性 属于 ColorSlider..

类型的特定控件

修复应该像将 Control 转换为 ColorSlider

一样简单
foreach (Panel pnl in backPanel.Controls)
    {
        foreach (Control c in pnl.Controls)
        {
            ColorSlider.ColorSlider slider = c as ColorSlider.ColorSlider;
            if (slider != null)
            {
                slider.ThumbInnerColor = Color.FromArgb(99, 130, 208);
            }
        }
    }

foreach (Panel pnl in backPanel.Controls)
    {
        foreach (Control c in pnl.Controls)
        {
            if (c is ColorSlider.ColorSlider)
            {
                (c as ColorSlider.ColorSlider).ThumbInnerColor = Color.FromArgb(99, 130, 208);
            }
        }
    }

foreach (Panel pnl in backPanel.Controls)
    {
        foreach (Control c in pnl.Controls)
        {
            if (c is ColorSlider.ColorSlider)
            {
                ((ColorSlider.ColorSlider)c).ThumbInnerColor = Color.FromArgb(99, 130, 208);
            }
        }
    }

或较新的 C#

foreach (Panel pnl in backPanel.Controls)
{
    foreach (Control c in pnl.Controls)
    {
        if (c is ColorSlider.ColorSlider s)
        {
            s.ThumbInnerColor = Color.FromArgb(99, 130, 208);
        }
    }
}

您也可以使用 Controls.OfType<> 选项:

        foreach(Panel pnl in backPanel.Controls.OfType<Panel>())
        {
            foreach(ColorSlider cs in pnl.Controls.OfType<ColorSlider>())
            {
                cs.ThumbInnerColor = Color.FromArgb(99, 130, 208);
            }
        }