Arial Century Courier Georgia Tahoma Verdana Times New Roman
-
+
button.ControlType = ControlType;
Во-вторых, нужно добавить
TypeButton
в
ArrayList
, который содержит список кнопок:
// второе: добавить эту кнопку в массив
_buttons.Add(button);
После этого можно поместить в форму кнопку и добавить ее в список элементов управления формы:
// теперь разместим кнопку
button.Left = ButtonSpacing;
button.Width = ButtonWidth;
button.Top = _nextY;
button.Height = ButtonHeight;
//
настроить следующее значение у ...
_nextY += (ButtonHeight + ButtonSpacing);
// вывести кнопку ...
this.Controls.Add(button);
Наконец, необходимо присоединить событие
click
(нажатие) кнопки таким образом, чтобы мы могли иметь экземпляр элемента управления, который он представляет:
// затем присоединяем обработчик события ...
button.Click += new EventHandler(this.ButtonClick);
}
Пока еще мы не создали
ButtonClick
, — сделаем это сейчас:
// ButtonClick — вызывается всякий раз при нажатии кнопки ...
protected void ButtonClick(object sender, System.EventArgs e) {
// преобразовать sender в кнопку типа ...
TypeButton button = (TypeButton)sender;
Нашей первой задачей является преобразование
sender
в
TypeButton
. Это позволит использовать
CreateInstance
для создания элемента управления. Если мы уже имеем элемент управления, необходимо сначала удалить его из списка элементов управления формы:
// если уже имеется содержащийся элемент управления, удалим его ...
if (_containedControl != null)
Controls.Remove(_containedControl);
Создаем элемент управления:
// создать экземпляр нового элемента управления...
_containedControl = button.CreateInstance;
Наконец, мы можем поместить элемент управления в форму.
// поместить элемент управления на форме ...
_containedControl.Left = ButtonWidth + (3 * ButtonSpacing);
_containedControl.Top = ButtonSpacing;
_containedControl.Width = this.Width - _containedControl.Left - (4 * ButtonSpacing);
_containedControl.Height = this.Height - (8 * ButtonSpacing);
this.Controls.Add(_containedControl);
}
Тестирование полученного кода
Прежде чем можно будет увидеть окончательный вариант сделанного, необходимо добавить кнопку в форму. Используем элемент управления
System Windows.Forms.DataGrid
. Добавим следующий код в
Form1
:
private void Form1_Load(object sender, System.EventArgs e) {
// при загрузке
добавить тип кнопки ...
DataGrid grid = new DataGrid;
AddType(grid.GetType);
}
Теперь закончим проект. Нажав на кнопку
System.Windows.Forms.DataGrid
, увидим:
Завершая этот пример, покажем, как можно загрузить сборку во время выполнения, просмотреть сборку в поисках типов данных, которые являются произвольными из
System.Windows.Forms.Control
, и добавить кнопки для каждого найденного типа данных.
Чтобы загрузить сборку нам понадобится URL. Добавим следующий код в
Form1_Load
:
private void Form1_Load(object sender, System.EventArgs e) {
// при загрузке добавить тип кнопки ...
DataGrid grid = new DataGrid;
AddType(grid.GetType);
// найти имя нашей сборки
String filename = this.GetType.Module.Assembly.CodeBase;
Эта строка является обходной техникой для получения сборки, реализующей класс объекта, из которого вызывается код. В данном случае ее получают из URL сборки, содержащей
Form1
.
Нам нужно при загрузке сборки использовать
try…catch
, так как существуют процессы, которые могут пойти в этой процедуре неправильно. Мы используем общий метод на
Assembly
:
// проверить и загрузить сборку ...
try {
// используем LoadFrom ...
Assembly controlAssembly = Assembly.LoadFrom(filename);
После получения сборки проверим в ней типы данных:
// теперь получим список типов данных ...
foreach(Type testType in controlAssembly.GetTypes) {
Далее хитрость состоит том, чтобы создать экземпляр проверяемого типа данных, но преобразовать его в
Control
. Так как все это погружено в другой блок
try…catch
, то при переходе к следующей строке мы знаем, что имеется полностью квалифицированный элемент управления.
// попробуем создать экземпляр элемента управления
// и преобразовать его в элемент управления ...
try {
Control testControl = (Control)Activator.CreateInstance(testType);
Полезный совет.
System.Windows.Forms.Form
является производным от
Control
, так как он использует контейнеризацию свойств
Control
для вывода элементов управления, нарисованных в форме. Если проверить свойство
TopLevelControl
, оно всегда будет задано при выводе класса из формы.
// нам необходимо убедиться,