public class StrawPoll : System.Web.UI.WebControls.WebControl, INamingContainer { }
Здесь используется класс с именем
StrawPollControlBuilder
, определенный следующим образом:
internal class StrawPollControlBuilder : ControlBuilder {
public override Type GetChildControlType(string tagName, IDictionary attribs) {
if (tagName.ToLower.EndsWith("option")) return typeof(Option);
return null;
}
public override void AppendLiteralString(string s) {
// ничего не делать, чтобы избежать добавления встроенного текста
// к элементу управления
}
}
Здесь мы переопределяем метод
GetChildControlType
базового класса
ControlBuilder
чтобы он возвращал тип класса
Option
в ответ на тег с именем
<Option>
. Фактически, чтобы все работало в максимальном количестве ситуаций, мы ищем любое имя тега, которое оканчивается строкой
"option"
с буквами в верхнем или нижнем регистре.
Мы переопределяем также метод
AppendLiteralString
так, чтобы любой промежуточный текст, включая пробелы, игнорировался и не вызывал никаких проблем.
Когда это сделано в предположении, что в
StrawPoll
нет никаких других элементов управления, мы будем иметь все элементы управления
Option
содержащимися в коллекции
Controls
из
StrawPoll
. Эта коллекция не будет содержать никаких других элементов управления.
Отметим, что построитель элементов управления использует коллекцию атрибутов. Чтобы использовать это добавим следующую инструкцию
using
в пространство имен:
using System.Collections;
Стиль StrawPoll
Прежде чем перейти к рассмотрению самого класса
StrawPoll
, необходимо рассмотреть еще один вопрос проектирования.
StrawPoll
должен выводиться в трех формах:
□ Только кнопки для голосования
□ Только результаты
□ Кнопки для голосования и результаты
Для этого можно определить
перечисление, которое затем использовать как свойство элемента управления
StrawPoll
:
public enum pollStyle {
voteonly, valuesonly, voteandvalues
}
Как мы видели ранее, свойства, которые являются перечислениями, легко использовать, и мы можем применять текстовые имена в качестве значений атрибутов в ASP.NET.
Элемент управления StrawPoll
Теперь соберем все вместе. Для начала определим два свойства:
Title
дли вывода заголовка в элементе управления и
PollStyle
для хранения перечисления типа вывода. Оба они будут использовать
. Он будет выводить весь элемент управления выборочного опроса вместе со всеми вариантами выбора, принимая в расчет используемый стиль опроса. Мы выводим кнопки голосования, вызывая метод
RenderControl
производных элементов управления
Option
, и выводим результаты опроса графически и численно с помощью свойств Votes производных элементов управления
Option
для создания простого кода HTML.
Код, прокомментированный для ясности, будет выглядеть следующим образом: