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

ЖАНРЫ

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

Button btnVote = new Button;

btnVote.Text = "Vote";

btnVote.Click += new System.EventHandler(btnVote_Click);

Controls.Add(btnVote);

 }

 protected void btnVote_Click(object sender, System.EventArgs e) {

Increment;

 }

}

Отметим, что метод

Render
не был здесь переопределен. Это связано с тем, что этот элемент управления имеет одного наследника, кнопку голосования и никакой другой информации
для вывода. Поэтому можно использовать значение по умолчанию, которое будет просто изображением кнопки.

Построитель элемента управления StrawPoll

Теперь мы рассмотрим, как можно транслировать код ASP.NET каждого варианта выбора в элемент управления, который является потомком элемента управления

StrawPoll
. Чтобы сделать это, необходимо ассоциировать построитель элемента управления с классом
StrawPoll
с помощью атрибута
ControlBuilderAttribute
. Нам нужно также определить, что элементы управления-потомки не должны анализироваться никаким другим способом с помощью атрибута
ParseChildren
:

[ControlBuilderAttribute(typeof(StrawPollControlBuilder)) ]

[ ParseChildren(false) ]

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
для хранения перечисления типа вывода. Оба они будут использовать
ViewState
для сохранения состояния:

[ ControlBuilderAttribute (typeof (StrawPollControlBuilder)) ]

[ ParseChildren(false) ]

public class StrawPoll : System.Web.UI.WebControls.WebContol, INamingContainer {

 private string title = "Straw Poll";

 private pollStyle currentPollStyle = pollStyle.voteandvalues;

 public string Title {

get {

return title;

}

set {

title = value;

}

 }

 public pollStyle PollStyle {

get {

return currentPollStyle;

}

set {

currentPollStyle = value;

}

 }

}

Остальная часть этого класса посвящена методу

Render
. Он будет выводить весь элемент управления выборочного опроса вместе со всеми вариантами выбора, принимая в расчет используемый стиль опроса. Мы выводим кнопки голосования, вызывая метод
RenderControl
производных элементов управления
Option
, и выводим результаты опроса графически и численно с помощью свойств Votes производных элементов управления
Option
для создания простого кода HTML.

Код, прокомментированный для ясности, будет выглядеть следующим образом:

protected override void Render(HtmlTextWriter writer) {

 Option CurrentOption;

 long iTotalVotes = 0;

 long iPercentage = 0;

 int iColumns = 2;

 // Начало таблицы, изображение таблицы

 if (currentPollStyle == pollStyle.voteandvalues) {

iColumns = 3;

 }

 writer.Write("<TABLE border='1' bordercolor='black' bgcolor='#DDDDEB'" +

" width= '90%' cellpadding='1' cellspacing='1'" + " align='center'>");

 writer.Write("<TR><TD colspan='" + iColumns + align='center'"

+ " bgcolor='#FFFFDD'>");

 writer.Write("<B>" + title + "</B></TD></TR>");

 if (Controls.Count == 0) {

// текст по умолчанию, когда нет вариантов выбора

Поделиться с друзьями: