Доступ к компоненту в унаследованной форме из базовой формы

Ряд форм в моем проекте наследуются от базовой формы. В коллекцию Controls производных форм легко попасть, но я не нашел простого способа доступа к коллекции Components, поскольку VS помечает это как закрытое.

Я предполагаю, что это можно сделать с помощью рефлексии, но я не совсем уверен, как лучше это сделать, не работая с рефлексией раньше.

Прямо сейчас я использую своего рода неуклюжий обходной путь, при котором я перезаписываю функцию GetComponents и возвращаю массив интересующих меня компонентов. Это, очевидно, подвержено ошибкам, поскольку легко забыть реализовать переопределенную функцию или обновите его, когда добавлены компоненты.

Если у кого-нибудь есть какие-либо советы или может предложить лучший способ, я был бы рад услышать.

3 ответа

Если вы устанавливаете свойство Modifiers ваших компонентов в строго защищенное состояние, они становятся доступными без использования коллекции компонентов.

Изменить: Обнаружение может быть сделано с помощью отражения, чтобы пройтись по каждому полю. Хотя это может быть неоптимальным в вашем случае.

Установите модификатор компонентов в защищенный в вашем базовом классе формы. Удалите объявление "компоненты" во всех производных формах.

Вызовите этот метод ниже в событии загрузки базовой формы,

        public void SetComponentsStyle()
    {
        if (null != this.components)
        {
            foreach (Component comp in this.components.Components)
            {
                if (comp is ToolTip)
                {

                }
                else if (comp is ContextMenuStrip)
                {

                }
            }
        }
    }

Если вы беспокоитесь о том, что забыли переопределить функцию, сделайте ее абстрактной.

Другие вопросы по тегам