C# Невозможно перебрать коллекцию элементов управления и установить свойства пользовательского элемента управления в 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", и не найден доступный метод расширения "ThumbInnerColor", принимающий первый аргумент типа "Control" (вы пропустили директиву using или ссылку на сборку?)
Так у кого есть идеи как это исправить? Спасибо
3 ответа
Или в более новом 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);
}
}
Посмотрите на ошибку.. Элемент управления 'не содержит определения для' ThumbInnerColor '.., которое является истинным. Элемент управления не содержит этого свойства. Теперь посмотрите на ваш код:
c.ThumbInnerColor = Color.FromArgb(99, 130, 208);
вы пытаетесь установить свойство для объекта типа Control.. это свойство принадлежит конкретному элементу управления типа ColorSlider..
исправление должно быть таким же простым, как приведение элемента управления к 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);
}
}
}