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

时间:2019-02-24 04:22:35

标签: c# user-controls controlcollection

嗨,我有一个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'控件'不包含'ThumbInnerColor'的定义,并且找不到可以接受的扩展方法'ThumbInnerColor'接受类型为'Control'的第一个参数(是否缺少using指令或程序集引用?)

因此,有人对如何解决此问题有想法吗? 谢谢

3 个答案:

答案 0 :(得分:2)

查看错误。 Control'不包含'ThumbInnerColor'的定义。这是正确的。 Control 不包含该属性。 现在看看您的代码:

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

您正试图在 Control 类型的 Object 上设置属性。 该属性属于 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);
            }
        }
    }

答案 1 :(得分:2)

或更新的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);
        }
    }
}

答案 2 :(得分:2)

您还可以使用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);
            }
        }