Вход/Регистрация
C# для профессионалов. Том II
вернуться

Ватсон Карли

Шрифт:

При анализе кода ASP.NET такие структуры интерпретируются согласованным образом: каждый управляющий элемент-потомок интерпретируется способом, который определен в классе-построителе элемента управления, связанным с элементом управления предком. Этот построитель элемента управления, код которого мы скоро увидим, обрабатывает все вложенное внутрь элемента управления, с которым он связан, включая литеральный текст.

Нам нужно создать два элемента управления:

Option
— для хранения отдельных вариантов выбора и
StrawPoll
, который будет содержать и выводить элемент управления выборочного опроса. Оба эти элемента управления будут помещены в новый файл исходного кода:
StrawPoll.cs
.

Элемент управления Option

Для начала создадим элементы управления Option, каждый из которых будет содержать имя варианта выбора и количество голосов, поданных за этот вариант выбора. Кроме того, эти элементы управления будут поддерживать кнопки голосования и обрабатывать все сделанные нажатия этих кнопок.

Поэтому нам потребуется:

□ Код для свойств

Name
и
Votes
(хранимых в
ViewState
)

□ Код инициализации в

CreateChildControls

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

Мы включаем также вспомогательный метод

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) {

  • Читать дальше
  • 1
  • ...
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: