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

на главную - закладки

Жанры

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

Ватсон Карли

Шрифт:

}

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

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

Медиум

Злобин Михаил
1. О чем молчат могилы
Фантастика:
фэнтези
7.90
рейтинг книги
Медиум

На границе империй. Том 10. Часть 1

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

Громовая поступь. Трилогия

Мазуров Дмитрий
Громовая поступь
Фантастика:
фэнтези
рпг
4.50
рейтинг книги
Громовая поступь. Трилогия

Калибр Личности 1

Голд Джон
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 1

Попаданка в деле, или Ваш любимый доктор

Марей Соня
1. Попаданка в деле, или Ваш любимый доктор
Фантастика:
фэнтези
5.50
рейтинг книги
Попаданка в деле, или Ваш любимый доктор

Кодекс Крови. Книга VIII

Борзых М.
8. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VIII

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Господин моих ночей (Дилогия)

Ардова Алиса
Маги Лагора
Любовные романы:
любовно-фантастические романы
6.14
рейтинг книги
Господин моих ночей (Дилогия)

Зауряд-врач

Дроздов Анатолий Федорович
1. Зауряд-врач
Фантастика:
альтернативная история
8.64
рейтинг книги
Зауряд-врач

Неудержимый. Книга XVI

Боярский Андрей
16. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVI

Измена. Право на семью

Арская Арина
Любовные романы:
современные любовные романы
5.20
рейтинг книги
Измена. Право на семью

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.00
рейтинг книги
Чужая семья генерала драконов

Последняя Арена 6

Греков Сергей
6. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 6

На границе империй. Том 10. Часть 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 3