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

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

Жанры

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

Ватсон Карли

Шрифт:

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

offset
поддерживает свое состояние, не требуя специального внимания. Однако эта техника не имеет смысла для приложения Web, когда потенциально тысячи пользователей используют его одновременно. Создание отдельного экземпляра для каждого пользователя только ухудшает ситуацию.

В любом случае решение достаточно просто. Мы должны использовать свойство

ViewState
элемента управления для сохранения и извлечения данных. Нам не нужно беспокоиться о том, как это сериализуется, создается заново или о чем-то еще,
мы просто помещаем данные в свойство и извлекаем данные, уверенные, что состояние будет поддерживаться между запросами стандартными средствами ASP.NET.

Чтобы поместить поле

offset
в
ViewState
, мы используем следующий код:

ViewState["_offset"] = offset;

ViewState
состоит из пар имя-значение, и в данном случае используется имя
_offset
. Нам не нужно объявлять его где-либо, оно будет создано при первом использовании этого кода.

Аналогично для извлечения состояния используется код:

offset = (inc)ViewState["_offset"];

Если мы сделаем это, когда ничего не хранится в

ViewState
под этим именем, то будет получено значение
null
. Простейший способ справиться с такой ситуацией — использовать вызов в блоке
try
.

Собирая все вместе, сделаем следующие изменения в коде:

public class RainbowLabel : System.Web.UI.WebControls.Label {

 private Color[] colors = new Color[] {

Color.Red, Color.Orange, Color.Yellow,

Color.GreenYellow, Color.Blue, Color.Indigo, Color.Violet

 };

 private int Offset;

 protected override void Render(HtmlTextWriter writer) {

string text = Text;

GetOffset;

for (int pos = 0; pos < text.Length; pos++) {

int rgb = colors[(post + offset) % 7].ToArgb & 0xFFFFFF;

writer.Write("<font color='#" + rgb.ToString("X6") + "'>" + text[pos] + "</font>");

}

 }

 private void GetOffset {

try {

offset = (int)ViewState["_offset"],

} catch {

offset = 0;

}

 }

 public void Cycle {

GetOffset;

offset = ++offset % 7;

ViewState["_offset"] = offset;

 }

}

Теперь элемент управления позволит методу

Cycle
работать каждый раз. Обычно
ViewState
используется для простых свойств, таких как свойства
string
:

public string Name {

 get {

return (string)ViewState["_name"];

 }

 set {

ViewState["_name"] = value;

 }

}

Еще

одно замечание об использовании
ViewState
имеет отношение к элементам управления-потомкам. Если элемент управления имеет потомков и используется на странице больше одного раза, то возникает проблема, связанная с тем, что потомки будут по умолчанию сообща использовать свой
ViewState
. Практически в каждом случае это не то поведение, которое требуется, и к счастью мы имеем простое решение. Выводя элемент управления-предок из
INamingContainer
мы вынуждаем элементы управления-потомки использовать квалифицированное хранилище в
ViewState
, так что элементы управления-потомки не будут сообща использовать свой
ViewState
с аналогичными элементами управления-потомками с другим предком.

Использование этого интерфейса не требует никакой дополнительной реализации, нам нужно просто сказать, что мы его используем, как если бы это был просто маркер для интерпретации сервером ASP.NET. Мы сделаем это в следующем разделе.

Создание композитного специального элемента управления

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

Назовем этот композитный элемент управления

RainbowControl2
и поместим его в новый файл
RainbowControl2.cs
. Этот элемент управления должен делать следующее:

□ Наследовать из

WebControl
(а не от
Label
в этот раз)

□ Поддерживать

INamingContainer

□ Иметь два поля для хранения своих элементов управления-потомков

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

 private RainbowLabel rainbowLabel = new RainbowLabel;

 private Button cycleButton = new Button;

Чтобы сконфигурировать композитный элемент управления, необходимо сделать так, чтобы всякий элемент управления-потомок добавлялся к коллекции

Controls
и правильно инициализировался. Мы делаем это, переопределяя метод
CreateChildControls
и помещая туда необходимый код:

protected override void CreateChildControls {

 cycleButton.Text = "Cycle colors.";

 cycleButton.Click += new System.EventHandler(cycleButton_Click);

 Controls.Add(cycleButton);

 Controls.Add(rainbowLabel);

}

Здесь мы используем только метод

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

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

Медиум

Злобин Михаил
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