Книга: C# для профессионалов. Том II
Создание композитного специального элемента управления
Создание композитного специального элемента управления
В качестве несложного примера композитного специального элемента управления можно объединить элемент управления из предыдущего раздела с кнопкой цикла, которая имелась на тестовой форме.
Назовем этот композитный элемент управления RainbowControl2
и поместим его в новый файл RainbowControl2.cs
. Этот элемент управления должен делать следующее:
? Наследовать из WebControl
(а не от Label
в этот раз)
? Поддерживать INamingContainer
? Иметь два поля для хранения своих элементов управления-потомков
public class RainbowLabel2 : System.Web.UI.WebControls.WebControl, INamingContainer {
private RainbowLabel rainbowLabel = new RainbowLabel();
private Button cycleButton = new Button();
Чтобы сконфигурировать композитный элемент управления, необходимо сделать так, чтобы всякий элемент управления-потомок добавлялся к коллекции Controls
и правильно инициализировался. Мы делаем это, переопределяя метод CreateChildControls()
и помещая туда необходимый код:
protected override void CreateChildControls() {
cycleButton.Text = "Cycle colors.";
cycleButton.Click += new System.EventHandler(cycleButton_Click);
Controls.Add(cycleButton);
Controls.Add(rainbowLabel);
}
Здесь мы используем только метод Add()
коллекции Controls
, чтобы работа была корректной. Добавляем также обработчик событий для кнопки, чтобы мы могли циклически менять цвета, это достигается точно таким же образом, как и для других событий. Обработчик событий уже знаком:
protected void cycleButton_Click(object sender, System.EventArgs e) {
rainbowLabel.cycle();
}
Данный вызов заставляет цвета метки циклически изменяться.
Чтобы предоставить пользователям композитного элемента управления доступ к тексту в потомке rainbowLabel
, можно добавить свойство, которое отображается в свойство Text
потомка:
public string Text {
get {
return rainbowLabel.Text;
}
set {
rainbowLabel.Text = value;
}
}
Осталось только реализовать Render()
. По умолчанию, если не переопределить этот метод, вызывается метод Render()
каждого элемента управления потомка. Однако, чтобы получить дополнительный контроль над этим, можно самим вызывать эти методы или, лучше, открытые экземпляры методов RenderControl()
:
protected override void Render(HtmlTextWriter writer) {
rainbowLabel.RenderControl(writer);
cycleButton.RenderControl(writer);
}
Здесь не выводится никакой код HTML, хотя можно было легко это сделать. Нам нужно просто передать полученный экземпляр HtmlTextWriter
в метод RenderControl()
для потомка, чтобы обычным образом был вставлен HTML, созданный этим потомком. Можно использовать такой элемент управления почти так же, как и RainbowLabel
:
<form method="post" runat="server">
<PCS:RainbowLabel2 Runat="server"
Text="Multicolored label composite" />
</form>
вместе со связанным объявлением в скрытом коде формы.
- Простой элемент управления пользователя
- Преобразование приложения предварительного заказа мероприятия в элемент управления пользователя
- Специальные элементы управления
- Конфигурация проекта специального элемента управления
- Базовые специальные элементы управления
- Производный элемент управления RainbowLabel
- Создание композитного специального элемента управления
- Элементы управления пользователя
- Основные "рычаги" управления производительностью
- Создание файлов с блокировкой
- Категорийный менеджмент. Курс управления ассортиментом в рознице
- Создание свободно позиционируемых элементов
- 12. Лекция: Создание приложений с графическим интерфейсом пользователя.
- Создание объектов Collection
- 7.4.2.4. Создание своего первого LiveCD
- 4.2. Создание трехмерной модели и построение горизонтальной проекции детали
- 7.4.2. Создание собственного LiveCD
- Создание пользователя и группы на рабочей станции
- Создание корня документа: