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);
            }
        }
    }
Другие вопросы по тегам