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

на главную

Жанры

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

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

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

Мастер Разума VII

Кронос Александр
7. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер Разума VII

Набирая силу

Каменистый Артем
2. Альфа-ноль
Фантастика:
фэнтези
боевая фантастика
рпг
6.29
рейтинг книги
Набирая силу

Аристократ из прошлого тысячелетия

Еслер Андрей
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Аристократ из прошлого тысячелетия

70 Рублей - 2. Здравствуй S-T-I-K-S

Кожевников Павел
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
постапокалипсис
5.00
рейтинг книги
70 Рублей - 2. Здравствуй S-T-I-K-S

Сама себе хозяйка

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

Треск штанов

Ланцов Михаил Алексеевич
6. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Треск штанов

LIVE-RPG. Эволюция 2

Кронос Александр
2. Эволюция. Live-RPG
Фантастика:
социально-философская фантастика
героическая фантастика
киберпанк
7.29
рейтинг книги
LIVE-RPG. Эволюция 2

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

Последний попаданец 11. Финал. Часть 1

Зубов Константин
11. Последний попаданец
Фантастика:
фэнтези
юмористическое фэнтези
рпг
5.00
рейтинг книги
Последний попаданец 11. Финал. Часть 1

Обгоняя время

Иванов Дмитрий
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Обгоняя время

Отверженный VI: Эльфийский Петербург

Опсокополос Алексис
6. Отверженный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Отверженный VI: Эльфийский Петербург

Изгой. Трилогия

Михайлов Дем Алексеевич
Изгой
Фантастика:
фэнтези
8.45
рейтинг книги
Изгой. Трилогия

Физрук 2: назад в СССР

Гуров Валерий Александрович
2. Физрук
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Физрук 2: назад в СССР

Адепт. Том второй. Каникулы

Бубела Олег Николаевич
7. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.05
рейтинг книги
Адепт. Том второй. Каникулы