Вопрос по visual-studio-2008, c# – Как получить доступ к унаследованным элементам управления в конструкторе winforms

10

Я делаю некоторые элементы управления, которые должны иметь одинаковый внешний вид и общее поведение, хотя они предназначены для разных видов ввода. Поэтому я создал 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>
Не могли бы вы наследовать от самой TableLayoutPanel? SLaks
Конечно, вы всегда можете создать свой собственный элемент управления, унаследованный от элемента управления winforms. Я сделал это, чтобы реализовать некоторые элементы управления. Но это не то, чего я пытаюсь достичь здесь. Я пытаюсь создать элемент управления с несколькими базовыми элементами управления внутри: табличная табличка с несколькими элементами управления (например, надписью) и несколько пустых пространств, которые унаследовали классы, должны заполняться элементами управления по их выбору. Конечная цель состоит в том, чтобы добавить все элементы управления этими тезисами на панель инструментов, а затем перетащить их в конструктор, чтобы создать формы, которые имеют много элементов управления, но имеют общее поведение / макет в этих элементах управлени Ksempac
И, между прочим, наследование от элемента управления Winform отключит конструктор, поскольку обычно дело только в реализации определенного поведения, а не в перепроектировании элемента управления самостоятельно. Ksempac

Ваш Ответ

5   ответов
11

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

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

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

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

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

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
Это то, что делает SplitContainer SLaks
Нет, это не работает. Ksempac
Попробуйте сделать поле приватным и добавить этот атрибут в открытое свойство, открывающее его. SLaks
Не похоже на работу, см. Редактирование в исходном сообщении. Ksempac
0

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

0

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

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

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

Похожие вопросы