Как получить доступ к унаследованным элементам управления в конструкторе winforms - PullRequest
10 голосов
/ 26 июня 2009

Я делаю некоторые элементы управления, которые должны иметь одинаковый внешний вид и общее поведение, хотя они предназначены для разных типов ввода. Поэтому я создал BaseClass, который наследуется от UserControl, а все мои элементы управления наследуются от BaseClass.

Однако, если я добавляю элементы управления для BaseClass в конструктор, например TableLayoutPanel, я не могу получить к ним доступ при разработке унаследованных классов. Я вижу TableLayoutPanel, но, хотя он «защищен», я не могу изменить его или поместить в него элементы управления через конструктор. У меня нет проблем с доступом к нему по коду, но я не хочу потерять возможность использовать конструктор.

Прямо сейчас я просто удалил все элементы управления из BaseClass, добавил макет и все общие элементы управления в каждом унаследованном классе, а затем использовал ссылки для управления ими внутри BaseClass. Но это меня совсем не удовлетворяет. Есть ли способ заставить дизайнера работать с унаследованными защищенными элементами управления?

Среда: C #, .NET 3.5, Visual Studio 2008

РЕДАКТИРОВАТЬ, чтобы ответить на предложение SLaks. Я попытался установить свойство, и, хотя я не привык использовать его, похоже, оно не работает. Вот код, который я попробовал:

    public partial class UserControl1 : UserControl
    {
            public UserControl1()
            {
                    InitializeComponent();
            }

            public TableLayoutPanel TableLayoutPanel1
            {
                    get { return tableLayoutPanel1;}
                    set { tableLayoutPanel1 = value;}
            }
    }

    public partial class UserControl2 : UserControl1
    {
            public UserControl2()
            {
                    InitializeComponent();
            }
    }

Ответы [ 5 ]

11 голосов
/ 14 ноября 2009

Когда вы пытаетесь получить доступ от унаследованного элемента управления с помощью конструктора к TableLayoutPanel, объявленному в базовом элементе управления, вы используете в WinForms функцию, называемую «Визуальное наследование».

К сожалению, TableLayoutPanel не поддерживает визуальное наследование: http://msdn.microsoft.com/en-us/library/ms171689%28VS.80%29.aspx

Вот почему TableLayoutPanel заблокирован в унаследованных элементах управления.

1 голос
/ 26 июня 2009

Попробуйте добавить этот атрибут в определение панели (это может или не может помочь):

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
0 голосов
/ 01 июля 2009

Я смутно помню, как решал подобную проблему, поместив базовый класс в свою собственную DLL и сначала собрав ее. Я порылся, но не могу найти проект. К сожалению.

0 голосов
/ 26 июня 2009

Попробуйте сделать ParentControlDesigner для своего контроля, переопределить InternalControlDesigner и вернуть (designerHost.GetDesigner(tableLayoutPanel) as ControlDesigner). designerHost - это (IDesignerHost) component.Site.GetService(typeof(IDesignerHost)).

0 голосов
/ 26 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...