- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания C# для профессионалов. Том II - Симон Робинсон
Шрифт:
Интервал:
Закладка:
</asp:RadioButtonList>
</form>
</BODY>
Нам нужно также добавить обработчик событий для события списка SelectedIndexChanged, который мы можем сделать просто с помощью двойного щелчка мышью на элементе управления в графическом представлении.
Отметим, что нужно задать свойство autopostback этого списка как true, так как обработчик события suitList_SelectedIndexChanged() не будет выполняться на сервере, если обратная отправка не задана, и этот элемент управления не включает обратную отправку по умолчанию.
Для метода suitList_SelectedIndexChanged() требуется следующий код в WebForm1.aspx.cs:
protected void suitList_SelectedIndexChanged(object sender, System.EventArgs e) {
MyUserControl.Suit = (suit)Enum.Parse(typeof(suit), suitList.SelectedItem.Value);
}
Мы знаем, что атрибуты value элементов <ListItem> представляют допустимые значения перечисления suit, которое было определено ранее, поэтому мы анализируем их просто как типы перечислений (у нас здесь то же пространство имен, поэтому нам не нужно переопределять тип) и используем их как значения свойства Suit элемента управления пользователя. Мы преобразуем возвращаемый тип object в suit с помощью простого синтаксиса преобразования типов, и это невозможно сделать неявно.
Не нужно это усложнять, просто определим одно значение с помощью атрибута Suit формы Web, например:
<PCS:UserC1 Runat="server" id="myUserControl" Suit="diamond" />
Процессор ASP.NET достаточно разумен, чтобы получить правильный элемент перечисления из предоставленной строки:
Теперь можно изменять масть при выполнении этого приложения Web:
Затем мы зададим для элемента управления несколько методов. Это снова сделать несложно, нам нужно только добавить методы в класс PCSUserC1:
public void Club() {
Suit = suit.club;
}
public void Diamond() {
Suit = suit.diamond;
}
public void Heart() {
Suit = suit.heart;
}
public void Spade() {
Suit = suit.spade;
}
Эти четыре метода — Club(), Diamond(), Heart() и Spade() — изменяют выведенную на экран масть на ту, которая была указана.
Мы вызываем эти функции из четырех элементов управления на странице .aspx:
<asp:ImaqeButton Runat="server" ID="clubButton"
ImageUrl="CLUB.BMP" OnClick="clubButton_OnClick" />
<asp:ImageButton Runat="server" ID="diamondButton"
ImageUrl="DIAMOND.BMP" OnСlick="diamondButton_OnClick" />
<asp:ImageButton Runat="server" ID="heartButton"
ImageUrl="HEART.BMP" OnClick="heartButton_OnClick" />
<asp:ImageButton Runat="server" ID="spadeButton"
ImageUrl="SPADE.BMP" OnClick="spadeButton_OnClick" />
</form>
С помощью следующих обработчиков событий:
protected void clubButton_OnClick(object sender, System.Web.UI.ImageClickEventArgs e) {
myUserControl.Club()
}
protected void diamondButton_OnClick(object sender, System.Web.UI.ImageClickEventArgs e) {
myUserControl.Diamond();
}
protected void heartButton_OnClick(object sender, System.Web.UI.ImageClickEventArgs e) {
myUserControl.Heart();
}
protected void spadeButton_OnClick(object sender, System.Web.UI.ImageClickEventArgs e) {
myUserControl.Spade();
}
Теперь мы имеем четыре новые кнопки, которые можно использовать для изменения масти:
Отметим, что эти кнопки не изменяют выбранный переключатель, хотя сделать это было бы достаточно просто.
Теперь, создав элемент управления пользователя, можно использовать его на любой другой странице Web с помощью директивы <%@ Register %> и двух файлов исходного кода (PCSUserC1.ascx и PCSUserC1.ascx.cs), созданных для элемента управления.
Преобразование приложения предварительного заказа мероприятия в элемент управления пользователя
В большинстве случаев преобразование страницы ASP.NET в элемент управления пользователя выполнить легко, так как можно просто скопировать требуемый код в пустые файлы .ascx и ascx.cs. Можно даже выйти из положения в некоторых случаях, просто изменяя имя файла на .ascx, если поместить весь код C# в этот файл, а не использовать режим "code behind".
Однако в некоторых случаях это невозможно, так как существуют препятствия, которые необходимо рассмотреть, чтобы преобразовать приложение Web из предыдущей главы в элемент управления пользователя.
Это приложение использует переменную уровня приложения для множества данных, которая содержит таблицы данных мероприятий, участников и названий помещений. Если желательно использовать эту переменную таким же образом, нам понадобиться в этом проекте поместить код для извлечения множества данных в файле global.asax. То есть нам еще нужно добавить в проект ссылку Web на требуемую службу Web.
Существуют другие изменения, которые необходимо сделать, чтобы учесть факт, что элемент управления имеет базовый класс UserControl, а не Form. Например, UserControl не имеет коллекции Validators, поэтому невозможно просмотреть объекты Validator в этой коллекции с помощью кода, который использовался ранее:
protected void submitButton_click(object sender, System.EventArgs e) {
foreach (System.Web.UI.WebControls.WebControl validator in this.Validators) {
validator.Enabled = true;
}
this.Validate();
if (this.IsValid) {
...
Вместо этого необходимо использовать следующий подход:
protected void submitButton_Click(object sender, System.EventArgs e) {
validateEvent.Enabled = true;
validateRoom.Enabled = true;
validateName.Enabled = true;
validateAttendees.Enabled = true;
validateEvent.Validate();
validateRoom.Validate();
validateName.Validate();
validateAttendees.Validate();
if (validateAttendees.IsValid && validateEvent.IsValid &&
validateRoom.IsValid && validateName.IsValid) {
...
Существует также проблема с тем. что элемент управления использует итоговую проверку. Значит, другие области на странице, использующей этот элемент управления, будут требовать дополнительной работы для проверки. Это связано с тем, что итоговая проверка работает для всей страницы, включая все элементы управления проверкой, несмотря на то, где они находятся, поэтому может возникнуть путаница. Возможно, простейшим решением здесь является создание собственного обработчика проверки, который использует элементы управления проверкой только в элементе управления пользователя, один из них — элемент управления меткой, с помощью которого выводится требуемый текст вручную. Но здесь этот подход рассматриваться не будет.
В целом необходимо сделать все элементы управления пользователя полностью независимыми, что по сути означает, что данное приложение не является идеальным. Однако оно высветило некоторые ограничения элементов управления пользователя.
В следующем разделе мы увидим, как можно изменять элементы управления в значительно большей степени с помощью синтаксиса специальных элементов управления.
Специальные элементы управления
Специальные элементы управления — следующий шаг по сравнению с элементами управления пользователя в том смысле, что они являются полностью самодостаточными в сборках C#, не требуя отдельного кода ASP.NET. Это означает, что нам не нужно проходить через процесс сборки UI в файле .ascx. Вместо этого мы имеем полный контроль над тем, что записывается в поток вывода, то есть, над кодом HTML, созданным элементом управления.
Обычно для разработки специального элемента управления требуется больше времени, чем для элемента управления пользователя, так как синтаксис является более сложным и часто требуется написать значительно больший код, чтобы получить результат. Элемент управления пользователя, как мы видели, может просто объединять несколько других элементов управления, в то время как специальный элемент управления может делать практически что угодно.
Чтобы получить наиболее гибкое поведение специальных элементов управления, можно выводить класс из System.Web.UI.WebControls.WebControl. В этом случае создается полный специальный элемент управления. Иначе можно расширить функциональность существующего элемента управления, создавая производный специальный элемент управления. Наконец, можно сгруппировать существующие элементы управления почти так, как это делалось в предыдущем разделе, но с более логичной структурой, чтобы создать композитный специальный элемент управления:
Любой из этих элементов может использоваться на страницах ASP.NET одинаково. Необходимо только поместить созданную сборку в каталог bin приложения Web, которое будет его использовать, и зарегистрировать имена используемых элементов с помощью директивы <%@ Register %>. В этой директиве применяется немного другой синтаксис для специальных элементов управления: