Чтение онлайн

на главную - закладки

Жанры

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

 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
, оно всегда будет задано при выводе класса из формы.

// нам необходимо убедиться,

Поделиться:
Популярные книги

Темный Лекарь 5

Токсик Саша
5. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 5

Охота на разведенку

Зайцева Мария
Любовные романы:
современные любовные романы
эро литература
6.76
рейтинг книги
Охота на разведенку

Неудержимый. Книга XVI

Боярский Андрей
16. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVI

Газлайтер. Том 18

Володин Григорий Григорьевич
18. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 18

Ищу жену для своего мужа

Кат Зозо
Любовные романы:
любовно-фантастические романы
6.17
рейтинг книги
Ищу жену для своего мужа

На границе империй. Том 8. Часть 2

INDIGO
13. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8. Часть 2

По воле короля

Леви Кира
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
По воле короля

Черный Маг Императора 9

Герда Александр
9. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 9

Последняя Арена 8

Греков Сергей
8. Последняя Арена
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Последняя Арена 8

Измена. Вторая жена мужа

Караева Алсу
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Вторая жена мужа

Возмездие

Злобин Михаил
4. О чем молчат могилы
Фантастика:
фэнтези
7.47
рейтинг книги
Возмездие

Выстрел на Большой Морской

Свечин Николай
4. Сыщик Его Величества
Детективы:
исторические детективы
полицейские детективы
8.64
рейтинг книги
Выстрел на Большой Морской

Ты - наша

Зайцева Мария
1. Наша
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Ты - наша

Повелитель механического легиона. Том III

Лисицин Евгений
3. Повелитель механического легиона
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Повелитель механического легиона. Том III