Как использовать производные элементы управления в приложении Windows Forms - PullRequest
2 голосов
/ 22 ноября 2010

В лучшем случае я новичок в пользовательском интерфейсе, но я довольно хороший разработчик OO (если я сам так не говорю). Я не совсем понимаю, как работать с дизайнером. Я занимаюсь разработкой приложения для Windows Forms. У меня есть элемент управления (TabPage), полученный из System.Windows.Forms.TabPage, который я хочу поместить в System.Windows.Forms.TabControl элемент управления.

public class MyTabPage : TabPage
{ ... }

Я не уверен, как заставить дизайнера использовать мой элемент управления.

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

Я создал прототип приложения WinForms. Приложение имеет TabControl, с тремя вкладками на нем. Каждый TabPage имеет SplitterControl с элементом управления DataGridView в каждой половине разделителя. Два элемента управления DataGridView образуют подробное представление некоторых данных, которые нам нужно отредактировать. Я добавил несколько обработчиков событий для каждого элемента управления DataGridView и каждый раз, когда код обработчика помещается в форму. Форма становится довольно многолюдной, и она хотела бы использовать методы ОО для очистки вещей.

Я хотел бы сейчас переделать прототип, и поскольку каждый TabPage поведенчески идентичен, я хотел бы использовать ОО, чтобы абстрагироваться от некоторых сложностей. Вот тут-то и возникает мой недостаток опыта работы с дизайнером. Должен быть способ использовать дизайнер для чего-то более сложного, чем мой оригинальный прототип.

Ответы [ 4 ]

2 голосов
/ 22 ноября 2010

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

К сожалению, класс TabControlDesigner в System.Design.dll является внутренним и не может быть получен из. Вы должны написать полную замену для него. Это сложно, это довольно продвинутый дизайнер. Вы можете посмотреть Reflector, чтобы узнать, что нужно.

2 голосов
/ 22 ноября 2010

Вы на самом деле не меняете поведение TabPage, это всего лишь контейнер :).TabPage и TabControl довольно тесно связаны, и они, вероятно, должны быть.Ваш «контроль» - это то, что должно быть размещено на вкладке.Поэтому определите свой пользовательский элемент управления как панель с разделителем и двумя сетевыми представлениями, а затем просто перетащите свой пользовательский элемент управления на каждую вкладку в вашем приложении.Тандем Tab Control / Page будет по-прежнему работать автоматически, и ваш пользовательский код будет в соответствующем контроле.

1 голос
/ 22 ноября 2010

UserControl

Просто создайте пользовательский элемент управления, содержащий ваш элемент управления.Затем он будет доступен в окне панели инструментов Visual Studio.

Для получения более подробной информации, Общие сведения о конструкторе элементов управления пользователя ...

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

Учебное пособие немного отличается от Visual Studio 2010, но я уверен, что вы справитесьit.


Элемент управления TabPage

Что касается элемента управления TabPage, его нельзя использовать отдельно в конструкторе.Он должен быть частью TabControl.

TabControl состоит из элементов управления TabPage.Если вы используете конструктор для добавления / удаления любого TabPage, в бэк-энде он делает «новый TabPage», он не может определить, что ему нужно для создания нового экземпляра вашего производного класса TabPage.


Другое предложение

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

Поскольку TabPage является контейнером, вы должны создать UserControl, который содержит ваши SplitContainer и DataGridViews.Поэтому вы сможете повторно использовать этот UserControl на каждой вкладке.

Конструктор является лишь дополнением к программированию пользовательского интерфейса, это не является обязательным.Вы можете добавить UserControl к TabPage без использования дизайнера.

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

0 голосов
/ 01 сентября 2011

Это было давно, но я думал, что отвечу на этот вопрос.

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

Там, где я спотыкался, было то, что мне нужно было иметь контрольную команду.

Спасибо всем за помощь. Я был под некоторым давлением, когда я задал этот вопрос. Удивительно, как много я узнал за эти месяцы.

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