не был здесь переопределен. Это связано с тем, что этот элемент управления имеет одного наследника, кнопку голосования и никакой другой информации для вывода. Поэтому можно использовать значение по умолчанию, которое будет просто изображением кнопки.
Построитель элемента управления StrawPoll
Теперь мы рассмотрим, как можно транслировать код ASP.NET каждого варианта выбора в элемент управления, который является потомком элемента управления
StrawPoll
. Чтобы сделать это, необходимо ассоциировать построитель элемента управления с классом
StrawPoll
с помощью атрибута
ControlBuilderAttribute
. Нам нужно также определить, что элементы управления-потомки не должны анализироваться никаким другим способом с помощью атрибута
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 производных элементов управления