рассмотреть еще один вопрос проектирования. 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) {
// текст по умолчанию, когда нет вариантов выбора
writer.Write('<TR><TD bgcoLor='#FFFFDD'>No options to' + ' display.</TR></TD>');
} else {
// Получить общее число голосов
for (int iLoop = 0; iLoop < Controls.Count; iLoop++) {
// Получить вариант выбора
currentOption = (Option)Controls[iLoop];
// Просуммировать результаты голосования
iTotalVotes += currentOption.Votes;
}
// Вывести каждый вариант выбора
for (int iLoop = 0; iLoop < Controls.Count; iLoop++) {
// Получить вариант выбора
currentOption = (Option)Controls[iLoop];
// Поместить имя варианта выбора в первый столбец
writer.Write('<TR><TD bgcolor='#FFFFDD' width='15%'> ' +
currentOption.Name + ' </TD>');
// Добавить вариант голосования во второй столбец,
// если требуется
if (currentPollStyle != pollStyle.valuesonly) {
writer.Write('<TD width='1%' bgcolor='#FFFFDD'>'
+ '<FONT Color='#FFFVDD'>.</FONT>');
currentOption.RenderControl(writer);
writer.Write('<FONT Color = '#FFFFDD'>.</FONT></TD>');
}
// Поместить график, значение и проценты в третьем столбце,
// если требуется
if (currentPollStyle != pollStyle.voteonly) {
if (iTotalVotes > 0) {
iPercentage = (currentOption.Votes * 100) / iTotalVotes;