Специальные элементы управления могут также предоставлять специальные методы, инициировать специальные события, и отвечать производным элементам управления (если они существуют). Ниже мы рассмотрим:
□ Создание производных элементов управления
□ Создание композитных элементов управления
□ Создание более развитых элементов управления
Конечный пример будет элементом управления выбором, который разрешает пользователю голосовать за одну из нескольких возможностей, и выводить графически результаты голосования. Варианты выбора будут определяться с помощью вложенных элементов управления потомков способом, описанным ранее.
Создадим для начала простой
производный элемент управления.
Производный элемент управления RainbowLabel
Для этого первого примера создадим производный элемент управления из элемента управления
Label
и переопределим его метод
Render
для вывода многоцветного текста. Чтобы держать элементы управления примера в этой главе отдельно, создадим новые файлы исходного кода, поэтому для этого элемента управления создадим новый файл
.cs
с именем
RainbowLabel.cs
и введем в него следующий код:
namespace PCSCustomWebControls {
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Drawing;
public class RainbowLabel : System.Web.UI.WebControls.Label {
добавить подходящее объявление в код, реализующий форму (если оно не добавится автоматически):
public class WebForm1 : System.Web.UI.Page {
protected RainbowLabel rainbowLabel1;
...
В результате будет получено:
Поддержание состояния в специальном элементе управления
Каждый раз при создании элемента управления на сервере в ответ на запрос к серверу, он создается с самого начала. Это означает что любое простое поле элемента управления будет повторно инициализироваться. Чтобы элементы управления поддерживали состояние между запросами, они должны использовать
ViewState
, о чем требуется помнить при создании элементов управления.
Чтобы проиллюстрировать это, добавим дополнительное свойство в элемент управления
RainbowLabel
. Мы добавив метод с именем
Cycle
, который циклически перебирает доступные цвета и использует хранимое поле
offset
для определения цвета первой буквы выводимой строки.
Это поле должно использовать
ViewState
элемента управления, чтобы быть устойчивым между запросами. Если это не сделано и поле инициализируется в элементе управления, то все будет работать неправильно.
Здесь будет показан код для обоих случаев, чтобы увидеть ловушку, в которую очень легко попасть. Сначала мы посмотрим на код, который не может воспользоваться
ViewState
:
public class RainbowLabel : System.Web.UI.WebControls.Label {