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);
您正在尝试在类型为 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);
}
}
}
或较新的 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);
}
}
您好,我有一个 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);
您正在尝试在类型为 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);
}
}
}
或较新的 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);
}
}