Как получить доступ к унаследованным элементам управления в конструкторе winforms

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

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

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

Окружающая среда: C #, .NET 3.5, Visual Studio 2008

EDIT, чтобы ответить на предложение SLaks. Я попытался установить свойство, и, хотя я не привык использовать его, похоже, оно не работает. Вот код, который я попробовал:

<code>    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();
            }
    }
</code>
 SLaks26 июн. 2009 г., 15:17
Не могли бы вы наследовать от самой TableLayoutPanel?
 Ksempac26 июн. 2009 г., 15:41
Конечно, вы всегда можете создать свой собственный элемент управления, унаследованный от элемента управления winforms. Я сделал это, чтобы реализовать некоторые элементы управления. Но это не то, чего я пытаюсь достичь здесь. Я пытаюсь создать элемент управления с несколькими базовыми элементами управления внутри: табличная табличка с несколькими элементами управления (например, надписью) и несколько пустых пространств, которые унаследовали классы, должны заполняться элементами управления по их выбору. Конечная цель состоит в том, чтобы добавить все элементы управления этими тезисами на панель инструментов, а затем перетащить их в конструктор, чтобы создать формы, которые имеют много элементов управления, но имеют общее поведение / макет в этих элементах управлени
 Ksempac26 июн. 2009 г., 15:46
И, между прочим, наследование от элемента управления Winform отключит конструктор, поскольку обычно дело только в реализации определенного поведения, а не в перепроектировании элемента управления самостоятельно.

Ответы на вопрос(5)

ParentControlDesigner для вашего контроля, переопределениеInternalControlDesigner и возвращаясь(designerHost.GetDesigner(tableLayoutPanel) as ControlDesigner). designerHost является(IDesignerHost) component.Site.GetService(typeof(IDesignerHost)).

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

 Ksempac25 июн. 2009 г., 23:37
Установка строк, столбцов и размера TableLayoutPanel в базовом классе - это то, что я хотел бы сделать. Но это бессмысленно, если я не могу добавить элементы управления в макет при разработке производного класса. Например, имея пустую ячейку в моей табличной разметке, а затем добавьте через конструктор разные элементы управления в каждом производном классе в этой ячейке.
 Arnshea26 июн. 2009 г., 23:24
Вы не можете изменить базовый элемент управления при разработке производного элемента управления. В любом случае не легко. Если вы сделали «пустые места» открытыми (например, EmptyPanel1, EmptyPanel2, ...), а затем предоставили для них свой собственный TypeEditor, вы можете, по крайней мере, позволить им устанавливать элементы управления визуально. Однако создание редактора типов - это небольшая работа.

е может помочь):

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 SLaks26 июн. 2009 г., 14:27
Это то, что делает SplitContainer
 SLaks26 июн. 2009 г., 14:27
Попробуйте сделать поле приватным и добавить этот атрибут в открытое свойство, открывающее его.
 Ksempac26 июн. 2009 г., 08:41
Нет, это не работает.
 Ksempac26 июн. 2009 г., 14:43
Не похоже на работу, см. Редактирование в исходном сообщении.
Решение Вопроса

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

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

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

 Repo Man21 мар. 2012 г., 19:51
Я столкнулся с этой проблемой. FTA: «Используйте элемент управления TableLayoutPanel экономно.»
 garaber14 нояб. 2013 г., 18:44
Да, это похоже на тупик. Мне удалось найти большую часть исходного кода C # для таблицы и дизайнера, но, похоже, я никогда не найду файлы FlowPanelDesigner.uex, связанные с этим элементом управления

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

Ваш ответ на вопрос