рассмотреть еще один вопрос проектирования. 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;

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату