Рейтинговые книги
Читем онлайн C# для профессионалов. Том II - Симон Робинсон

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 44 45 46 47 48 49 50 51 52 ... 167

  </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 %>. В этой директиве применяется немного другой синтаксис для специальных элементов управления:

1 ... 44 45 46 47 48 49 50 51 52 ... 167
На этой странице вы можете бесплатно читать книгу C# для профессионалов. Том II - Симон Робинсон бесплатно.

Оставить комментарий