Спонсор: Microsoft
Опубликован: 14.11.2006 | Доступ: свободный | Студентов: 5820 / 513 | Оценка: 4.18 / 3.74 | Длительность: 16:37:00
ISBN: 978-5-9556-0085-7
Лекция 3:

Серверные элементы управления

< Лекция 2 || Лекция 3: 123456 || Лекция 4 >

Вот код этой страницы в браузере:

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Выбор категории товаров</title>
</head>
<body>
<br/>
<form name="ctl00" method="post" action="DropDownList.aspx" 
id="ctl00">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" 
value="/wEPDwUKLTc3Mjg2Njg5MQ9kFgICAQ9kFgICAw8PFgIeBFRleHQFLtCS0Ys
g0LLRi9Cx0YDQsNC70LggINCa0L7QvNC/0LDQutGCLdC00LjRgdC60LhkZGRURXB3F
72jDHrywdZ12h2Cw2f41A==" />
</div>

Выберите категорию товаров<br />
<select name="Category" id="Category">
	<option value=" Компьютеры "> Компьютеры </option>
	<option value="Принтеры">Принтеры</option>
	<option value=" Комплектующие "> Комплектующие </option>
	<option value=" Мониторы "> Мониторы </option>
	<option selected="true" value=" Компакт-диски"> Компакт-
диски</option>

</select>
<input type="Submit">
<br />
<span id="lblMessage">Вы выбрали Компакт-диски</span>

<div>

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDA-
TION" value="/wEWBgKTtKPTDgLc5pLAAgLxxYKuBALL14rfCALaoI/9AgLP6q/dC9yI/KG
10xK67UImbEUJkicDdslR" />
</div></form>
</body>
</html>

Итак, браузеру посылается простая страница, на которой нет скриптов. То же поведение можно было бы запрограммировать с помощью JavaScript. Разница в том, что пользователь смог бы увидеть код на JavaScript, скопировать и использовать его на своих страницах. В этом нет ничего плохого, но иногда люди хотят сохранить свой код в тайне в целях защиты интеллектуальной собственности.

Посмотрим, как ASP .NET интерпретировал заголовок формы:

<form name="ctl00" method="post" action="DropDownList.aspx" 
id="ctl00">

Атрибуты name и id он сгенерировал самостоятельно. Их значение одинаково, разные браузеры позволяют обращаться к элементам формы по-разному: IE — через id, а Netscape Navigator — через name. Атрибуты method и action тоже не были указаны нами, он сгенерировал их по умолчанию как post и текущая страница.

А что значит скрытый элемент разметки, который мы видим на каждой сгенерированной ASP .NET странице? Это поле, сохраняющее состояние формы. Раньше форма была отдельной страницей, и когда она отправляла серверу данные, он генерировал совершенно другую страницу. В ASP .NET форма подает себя сама, она работает на входе и на выходе.

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

Свойство Items элемента управления DropDownList имеет несколько методов для добавления и удаления строк. Используя методы Add и Insert, можно добавить элемент или вставить его в указанную позицию в DropDownList ; AddRange позволяет добавить массив элементов в DropDownList ; метод Clear удаляет все элементы; методы Remove и RemoveAt удаляют указанный элемент или элемент, находящийся в указанной позиции соответственно. Например, так можно программно создать DropDownList в функции Page_Load:

Category = new DropDownList();
    Category.Items.Add("Компьютеры");
    Category.Items.Add("Принтеры");
    Category.Items.Add("Комплектующие");

    ListItem selItem = new ListItem("Мониторы", "мониторы");
    Category.Items.Add(selItem);
    Category.Items.Add(new ListItem("Компакт-диски"));
    Category.SelectedIndex = 3;

Чтобы очистить выбор в элементе DropDownList, установите SelectedIndex в (-1).

Если установить у ListItem свойство Enable в false, то он будет не виден в списке, однако с ним можно работать из программы. Событие SelectedIndexChanged запускается, когда пользователь выбирает другой элемент.

ListBox

Если у тега < select > указать атрибут SIZE, больший 1 (значение по умолчанию), то получим простой невыпадающий список. Ему соответствует < asp:ListBox >.

Элемент управления позволяет выбрать несколько пунктов списка одновременно. Для этого надо установить его свойство SelectionMode:

SelectionMode="multiple"

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

Свойство Items возвращает коллекцию элементов ListItem, которые находятся в списке. Оно позволяет определить выбранные пункты.

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

<%@ Page Language="C#" %>

<script runat="server">

  void Page_Load()
  {
    string msgCitiesList = "";
    if (Page.IsPostBack)
      foreach (ListItem it in cities.Items)
        if (it.Selected)
        {
          msgCitiesList = msgCitiesList + it.Text + "<br />";
        }

    if (msgCitiesList != "")
    {
      Message.Text = "Вы выбрали следующие города: <br />" + 
msgCitiesList;
    }
    else
    {
      Message.Text = "";
    }
  }

</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Пример ListBox</title>
</head>
<body>
  Какие города вы хотите включить в свой маршрут?<br />
  <form id="Form1" runat="server">
    <asp:ListBox ID="cities" runat="server" SelectionMode="multiple">
      <asp:ListItem>Лондон</asp:ListItem>
      <asp:ListItem>Мадрид</asp:ListItem>
      <asp:ListItem>Париж</asp:ListItem>
      <asp:ListItem>Рига</asp:ListItem>
    </asp:ListBox><br />
    <input type="Submit">
    <p>
      <asp:Label ID="Message" runat="server" /><br />
  </form>
</body>
</html>

Событие SelectedIndexChanged имеется и тут, как и у всех классов-наследников от абстрактного класса ListControl.

< Лекция 2 || Лекция 3: 123456 || Лекция 4 >
Алексей Савельев
Алексей Савельев

https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx

Денис Прокофьев
Денис Прокофьев

Везде написано, что это самый независимый и простой в использовании навигационный элемент управления, что он работает сразу с web.sitemap и не требует определения SiteMapDataSource.

Моя карта сайта состоит из двух страниц, вложенных друг в друга. asp:Menu, asp:TreeView отбображаются как ожидалось, а вот asp:SiteMapPath - нет. Он не виден нигде. Однако на его месте формируется разметка: <span id="SiteMapPath1"><a href="#SiteMapPath1_SkipLink" style="position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden;">Проход по ссылкам навигации</a><a id="SiteMapPath1_SkipLink"></a></span> - т.е. элемент отрабатывает.

В словах xHTML это выглядит так: <asp:SiteMapPath ID="SiteMapPath1" runat="server" />. Причем не важно - внутри тега form или снаружи - всегда одинаково.

Т.к. другие нав. ЭУ работают через простой источник данных без ошибок, делаю вывод - карта составлена правильно. ИД: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Карта: <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/L11_1_simplePage.aspx" title="Страница 1"  description="Простая страница 1." >
    <siteMapNode url="~/L11_1SimplePage2.aspx" title="Страница 2"  description="Простая страница 2" />
  </siteMapNode>
</siteMap>

Почему так происходит? Вроде делаю все по примерам. VS Community 2015. NetFramework в проекте: v4.0.30319

Анна Малова
Анна Малова
Азербайджан, Баку
Дмитрий Крюков
Дмитрий Крюков
Россия, Москва