□ Код для обработчика нажатия кнопки

Мы включаем также вспомогательный метод Increment(), который будет добавлять голос к текущему счету. Этот вспомогательный метод вызывается обработчиком нажатия кнопки.

Нам понадобится также поддержка INamingContainer, так как мы имеем несколько экземпляров этих элементов управления со своими собственными потомками.

Код класса Option будет находиться в файле StrawPoll.cs, который мы должны добавить к проекту вместе со стандартными инструкциями namespace и using, согласно уже известным нам элементам управления RainbowLabel. Код будет иметь следующий вид:

public class Option : System.Web.UI.WebControls.WebControl, INamingContainer {

 public string Name {

  get {

   return (string)ViewState['_name'];

  }

  set {

   ViewState['_name'] = value;

  }

 }

 public long Votes {

  get {

   return (long)ViewState['_votes'];

  }

  set {

   ViewState['_votes'] = value;

  }

 }

 public void Increment() {

  ViewState['_votes'] =(long)ViewState['_votes'] + 1;

 }

 public void Reset() {

  ViewState['_votes'] = 0;

 }

 protected override void CreateChildControls() {

  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, необходимо

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

0

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

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