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

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

Жанры

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

Ватсон Карли

Шрифт:

namespace PCSCustomWebControls {

 using System;

 using System.Web.UI;

 using System.Web.UI.WebControls;

 using System.ComponentModel;

 using System.Drawing;

 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

};

protected override void Render(HtmlTextWriter output) {

string text=Text;

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

int rgb = colors[pos % 7].ToArgb & 0xFFFFFF;

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

}

}

 }

}

Этот

класс выводится из существующего элемента управления
Label
(
System.Web.UI.WebControls.Label
) и не требует никаких дополнительных свойств, так как достаточно унаследованного свойства
Text
. Мы добавили новое скрытое поле —
colors[]
, которое содержит массив цветов, циклически изменяющихся при выводе текста.

Основная функциональность элемента управления находится в

Render
, который переопределен, так как мы хотим изменить вывод HTML. Здесь мы берем строку для вывода из свойства
Text
и выводим каждый символ цветом из массива
colors[]
.

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

PCSCustomWebControlsTestApp
:

<form method="post" runat="server" ID="Form1">

 <PCS:RainbowLabel Runat="server" Text="Multicolored label!"

ID="rainbowLabel1" />

</form>

Нам нужно также добавить подходящее объявление в код, реализующий форму (если оно не добавится автоматически):

public class WebForm1 : System.Web.UI.Page {

 protected RainbowLabel rainbowLabel1;

 ...

В результате будет получено:

Поддержание состояния в специальном элементе управления

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

ViewState
, о чем требуется помнить при создании элементов управления.

Чтобы

проиллюстрировать это, добавим дополнительное свойство в элемент управления
RainbowLabel
. Мы добавив метод с именем
Cycle
, который циклически перебирает доступные цвета и использует хранимое поле
offset
для определения цвета первой буквы выводимой строки.

Это поле должно использовать

ViewState
элемента управления, чтобы быть устойчивым между запросами. Если это не сделано и поле инициализируется в элементе управления, то все будет работать неправильно.

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

ViewState
:

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 = 0;

 protected override void Render(HtmlTextWriter writer) {

string text = Text;

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

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

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

}

 }

 public void Cycle {

offset = ++offset % 7;

 }

}

Здесь мы инициализируем поле

offset
нулем, а затем позволяем методу
Cycle
увеличивать его. Использование оператора
%
гарантируем, что оно уменьшится до 0, если достигнет 7.

Чтобы протестировать это, требуется способ вызова метода

Cycle
и добавление кнопки к форме:

<form method="post" runat="server" ID="Form1">

 <PCS:RainbowLabel Runat="server" Text="Multicolored label!"

ID="rainbowLabel1" />

 <asp:Button Runat="server" ID="cycleButton"

Text="Cycle colors" OnClick="cycleButton_Click" />

</form>

Co следующим обработчиком событий:

protected void cycleButton_Click(object sender, System.EventArgs e) {

 this.rainbowLabel1.Cycle;

}

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

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

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Маленькая хозяйка большого герцогства

Вера Виктория
2. Герцогиня
Любовные романы:
любовно-фантастические романы
7.80
рейтинг книги
Маленькая хозяйка большого герцогства

Законы Рода. Том 10

Flow Ascold
10. Граф Берестьев
Фантастика:
юмористическая фантастика
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 10

Возмездие

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

Кровь эльфов

Сапковский Анджей
3. Ведьмак
Фантастика:
фэнтези
9.23
рейтинг книги
Кровь эльфов

Последний наследник

Тарс Элиан
11. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний наследник

Газлайтер. Том 4

Володин Григорий
4. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 4

Бастард

Осадчук Алексей Витальевич
1. Последняя жизнь
Фантастика:
фэнтези
героическая фантастика
попаданцы
5.86
рейтинг книги
Бастард

Князь

Шмаков Алексей Семенович
5. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
5.00
рейтинг книги
Князь

Жестокая свадьба

Тоцка Тала
Любовные романы:
современные любовные романы
4.87
рейтинг книги
Жестокая свадьба

Идеальный мир для Лекаря 14

Сапфир Олег
14. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 14

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

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

Болотник 3

Панченко Андрей Алексеевич
3. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Болотник 3

Черный Маг Императора 10

Герда Александр
10. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 10