C # Невозможно перебрать коллекцию элементов управления и установить свойства пользовательского элемента управления в Windows Forms - PullRequest
0 голосов
/ 24 февраля 2019

Привет, у меня есть приложение 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 ]

0 голосов
/ 24 февраля 2019

или более новый 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);
        }
    }
}
0 голосов
/ 24 февраля 2019

Вы также можете использовать опцию 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);
            }
        }
0 голосов
/ 24 февраля 2019

посмотрите на ошибку .. Control 'не содержит определения для' ThumbInnerColor ' .., которое является истинным .. Control не содержит этого свойства.теперь посмотрите на ваш код:

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

вы пытаетесь установить свойство для объекта типа Control .. это свойство принадлежит определенному элементу управлениятипа 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);
            }
        }
    }
...