загружаемой сборке. Создадим новый класс с именем TypeButton
и добавим ссылку на пространство имен System.Windows.Forms
.
using System;
using System.Windows.Forms;
Затем добавим код:
public class TypeButton System.Windows.Forms.Button {
public Type _controlType;
public TypeButton() {
}
// ControlType — получить или задать свойство ...
public Type ControlType {
get {
return _controlType;
}
set {
_controlType = value;
this.Text = _controlType.FullName;
}
}
}
Как можно видеть, задавая свойство ControlType
, мы изменяем текст кнопки, чтобы он стал полным названием типа.
Метод, который нужен для создания TypeButton
, создает экземпляр элемента управления. Добавим этот метод, использующий System.Activator
для создания экземпляра класса и преобразующий его в System.Windows.Forms.Control
:
// CreateInstance — создание экземпляра типа данных ...
public Control CreateInstance() {
// возвращает экземпляр нового элемента управления ...
return (Control)Activator.CreateInstance(ControlType);
}
Для первого проверочного запуска добавим TypeButton
, который представляет экземпляр элемента управления System.Windows.Forms.DataGrid
. Это позволит протестировать логику того, что делается, не вдаваясь в дополнительные трудности, связанные с загрузкой сборки и просмотром типов данных.
Метод Form1.AddType
будет получать объект System.Type
и добавлять новый объект TypeButton
в форму. Во-первых, необходимо создать экземпляр TypeButton
и задать его свойство ControlType
новым типом:
// AddType - добавить кнопку типа в компоновку ...
public void AddType(Type ControlType) {
// первое: создать новую кнопку типа ...
TypeButton button = new TypeButton();
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
, увидим: