CheckBoxList
Некоторые голосования предполагают возможность выбора больше одного варианта. Так же реализованы и тесты, которые вы проходите в конце лекций.
<asp:Label ID="Label1" runat="server" Text="Как реализуется связывание с данными в ваших ASP.NET 2.0 приложениях?"></asp:Label> <asp:CheckBoxList ID="CheckBoxList1" runat="server"> <asp:ListItem>На каждой страничке создаётся SqlDataSource, с ним идёт декларативное связывание.</asp:ListItem> <asp:ListItem>В проекте есть DataSet, на страничках ObjectDataSourcе'ы, и с ними декларативное связывание.</asp:ListItem> <asp:ListItem>Недекларативное связывание, запрос прописан на каждой страничке.</asp:ListItem> <asp:ListItem>Недекларативное связывание с использованием одного большого DataSet'а</asp:ListItem> </asp:CheckBoxList>
Если в CheckBoxList множество вариантов, то можно их расположить в несколько столбцов. При этом можно двигаться сверху вниз — справа налево, или наоборот. Это зависит от RepeatDirection — Horizontal или Vertical. Текст может быть расположен справа или слева от флажка.
DropDownList
Аналог этого элемента в HTML — выпадающие меню. Они задаются с помощью тегов <SELECT> и </SELECT>, между которыми находятся один или несколько тегов:
<OPTION>. <BR>Каталог <SELECT NAME="Выбор"> <OPTION>Компьютеры <OPTION>Принтеры <OPTION VALUE="Комплектующие"> Комплектующие <OPTION SELECTED>Мониторы <OPTION>Компакт-диски </SELECT>
DropDownList выдаст тот же самый код, если будет определен так:
<asp:DropDownList id="Выбор" runat="server"> <asp:ListItem> Компьютеры </asp:ListItem > <asp:ListItem >Принтеры</asp:ListItem > <asp:ListItem > Комплектующие </asp:ListItem > <asp:ListItem Selected="true"> Мониторы </asp:ListItem > <asp:ListItem > Компакт-диски</asp:ListItem > </asp:DropDownList >
Итак, если мы хотим перейти с написания страниц HTML к написанию кода ASP:
<asp:DropDownList> пишется вместо <SELECT> <asp:ListItem > вместо <OPTION>
Вместо атрибута NAME пишем атрибут id.
Вместо атрибута SELECTED пишем атрибут Selected и присваиваем ему true.
Атрибут VALUE можно задать и в HTML. Если его нет, ASP .NET генерирует его из текста ListItem:
<select name="Выбор" id="Выбор"> <option value=" Компьютеры "> Компьютеры </option> <option value="Принтеры">Принтеры</option> <option value=" Комплектующие "> Комплектующие </option> <option selected="selected" value=" Мониторы "> Мониторы </option> <option value=" Компакт-диски"> Компакт-диски</option> </select>
Отличие серверных элементов управления в том, что их можно программировать на сервере и получать информацию от них тоже на сервере.
Попробуем написать такую страницу:
<%@ Page Language="C#" %>
<script runat="server" language="C#"> void Page_Load() { if (Page.IsPostBack) lblMessage.Text = "Вы выбрали " + Category.SelectedItem.Value; } </script>
<html xmlns=""http://www.w3.org/1999/xhtml""> <head> <title>Выбор категории товаров</title> </head> <body> <br /> <form id="Form1" runat="server"> Выберите категорию товаров<br /> <asp:DropDownList ID="Category" runat="server"> <asp:ListItem> Компьютеры </asp:ListItem> <asp:ListItem>Принтеры</asp:ListItem> <asp:ListItem> Комплектующие </asp:ListItem> <asp:ListItem Selected="true"> Мониторы </asp:ListItem> <asp:ListItem> Компакт-диски</asp:ListItem> </asp:DropDownList> <input type="Submit"> <br /> <asp:Label ID="lblMessage" runat="server" /> </form> </body> </html>
Запустите ее на выполнение, выберите "Компакт-диски" и нажмите на кнопку. На форме появится надпись "Вы выбрали Компакт-диски".
Выберите категорию товаров<br /> <select name="Category" id="Category"> <option value=" Компьютеры "> Компьютеры </option> <option value="Принтеры">Принтеры</option> <option value=" Комплектующие "> Комплектующие </option> <option value=" Мониторы "> Мониторы </option> <option selected="selected" 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 запускается, когда пользователь выбирает другой элемент.
Label
Этот элемент управления позволяет выводить отформатированный текст, аналогично обобщенному строчному элементу разметки <SPAN>. Всеми свойствами этого объекта можно управлять из вашей программы ASP .NET.
Большинство методов и свойств унаследовано от WebControl. Главное собственное свойство — это, конечно, его содержание — Text.
Нижеперечисленные свойства управляют внешним видом элемента, присутствуют в классе WebControl и, следовательно, применимы ко всем элементам-наследникам WebControl, а не только к Label.
BackColor | Цвет фона |
BorderColor | Цвет границы элемента управления |
BorderStyle | Стиль границы — сплошной, пунктир, точечный, двойной и другие |
BorderWidth | Ширина границы |
Enabled | Активность. Если false, нельзя вводить данные, не получает фокус |
Font | Шрифт, состоит из нескольких атрибутов |
ForeColor | Цвет, которым отображается текст |
Height | Высота элемента |
Width | Ширина элемента |
Visible | Виден ли элемент управления |
TabIndex | Индекс табуляции, в порядке номеров которых в форме перемещается фокус при нажатии на клавишу Tab |
ToolTip | Текст окна подсказки |
В версии 2.0 появилась возможность задавать для элементов управления "горячие" клавиши, или клавиши быстрого доступа. Свойство AccessKey определяет последовательность нажатых клавиш, которые приводят к установке фокуса на данном элементе. Например, AccessKey="N" значит, что для вызова функциональности надо нажать на Alt+N. Установить фокус в Label невозможно, поэтому устанавливаем свойство AssociatedControlId, которое указывает на другой элемент.
Если это TextBox, то фокус устанавливается в него.
Пример описания элемента Label:
<asp:Label id="ShopNews" runat="server" Font-Size =20 ForeColor="red" BackColor ="lightgray" BorderWidth=4 BorderStyle=groove Height=50 width=500> Новости торговой площадки </asp:Label>
Префикс asp: означает, что данный элемент стандартный. Можно создавать собственные контролы со своими префиксами (см. лекцию 14).
Текст между открывающим и закрывающим тегами будет показан на странице. Это содержание его свойства Text.
Так как Text — это такой же атрибут, как и другие, мы можем написать иначе:
<asp:Label id="ShopNews" runat="server" Font-Size =20 ForeColor="red" BackColor ="lightgray" BorderWidth=4 BorderStyle=groove Height=50 width=500 Text= "Новости торговой площадки" />
Вставим это описание в страницу aspx
<html xmlns=""http://www.w3.org/1999/xhtml""> <head> <title>Торговая площадка</title> </head> <body> <center> <h2> Демонстрация метки</h2> <br /> <form id="frmDemo" runat="server"> <asp:Label ID="ShopNews" runat="server" Font-Size="20" ForeColor="red" BackColor="lightgray" BorderWidth="4" BorderStyle="groove" Height="50" Width="500" Text="Новости торговой площадки" /> </form> </center> </body> </html>
и наслаждаемся эффектом. Надпись красного цвета на сером фоне. Стиль границы делает метку приподнятой над фоном.
Рис. 3.1.
У Label, как и у всех остальных классов, есть конструктор. Это значит, что создать его можно прямо в программе, а не прописывать на форме.
<%@ Page Language="C#" %> <%@ Import Namespace= "System.Drawing" %>
<script runat="server">
void Page_Load() { Label ShopNews = new Label(); ShopNews.Text = "Новости торговой площадки"; ShopNews.Font.Size=20; ShopNews.ForeColor=Color.Red; ShopNews.BackColor=Color.LightGray; ShopNews.BorderWidth=4; ShopNews.BorderStyle=BorderStyle.Groove; ShopNews.Height=50; ShopNews.Width=500;
frmDemo.Controls.Add(ShopNews); }
</script> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Торговая площадка</title> </head> <body> <center> <h2>Демонстрация метки</h2><br /> <form id="frmDemo" runat="server">
</form> </center> </body> </html>
Обратите внимание на директиву <%@ Import Namespace= "System.Drawing" %>. Директива импорта нужна, чтобы обращаться к перечислению Color названий цветов, определенному в System.Drawing.
Посмотрим, что выдал ASP .NET браузеру. Вот код HTML, относящийся к нашей метке:
<form name="frmDemo" method="post" action="shop.aspx" id="frmDemo"> <div> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTEzODAzNzU2NDZkZH95eciStELThSpcgXVWEFYeQxpR" /> </div> <span id="ShopNews" style="display:inline-block;color:Red;back- ground-color:LightGrey;border-width:4px;border-style:Groove;font- size:20pt;height:50px;width:500px;">Новости торговой площадки</span> </form>
Как видим, ASP .NET превратил метку в элемент разметки <span>, задав ему стили CSS. В форме появился еще один невидимый элемент по имени =__VIEWSTATE, который мы скоро обсудим.
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.
Panel
Часто бывает нужно вставить элемент управления в точно определенное место страницы. Например, объединим два предыдущих примера:
<%@ Page Language="C#" %> <%@ import Namespace="System.Drawing" %> <script runat="server">
void Page_Load() {
Label ShopNews = new Label(); ShopNews.Text = "Новости торговой площадки"; ShopNews.Font.Size=20; ShopNews.ForeColor=Color.Red; ShopNews.BackColor=Color.LightGray; ShopNews.BorderWidth=4; ShopNews.BorderStyle=BorderStyle.Groove; ShopNews.Height=50; ShopNews.Width=500;
frmDemo.Controls.Add(ShopNews);
if (Page.IsPostBack) lblMessage.Text = "Вы выбрали " + Category.SelectedItem.Value; }
</script> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Выбор категории товаров</title> </head> <body> <br/> <form id="frmDemo" runat="server"> Выберите категорию товаров<br /> <asp:DropDownList id="Category" runat="server"> <asp:ListItem> Компьютеры </asp:ListItem > <asp:ListItem >Принтеры</asp:ListItem > <asp:ListItem > Комплектующие </asp:ListItem > <asp:ListItem Selected="true"> Мониторы </asp:ListItem > <asp:ListItem > Компакт-диски</asp:ListItem > </asp:DropDownList > <br/> <input type="Submit" value="Выбрать"> <br/><br/> <asp:Label id="lblMessage" runat="server"/> </form> </body> </html>
Рис. 3.2.
Эта страница работает не так, как нам хотелось. Текст оказался после выпадающего списка, хотя логичней было бы, чтобы текст шел в начале. В HTML для этого используют элемент разметки <DIV> — стандартный контейнер. Его аналог в ASP .NET:
— <asp:Panel>.
Чтобы заставить метку отображаться перед списком, необходимо поместить перед DropDownList объект Panel:
<asp:Panel ID="Panel1" runat="server"></asp:Panel><br />
после чего вызывать метод Controls.Add(...) от этого объекта:
Panel1.Controls.Add(ShopNews);
Рис. 3.3.
Свойство HorizontalAlign элемента Panel полезно, если нужно установить выравнивание содержащихся в нем элементов управления. Поменяем код в предыдущем примере:
<asp:Panel ID="Panel1" runat="server" HorizontalAlign="Center" width=500 />
Текст теперь размещается в центре метки.
Булевское свойство Wrap элемента Panel заставляет переносить текст на новую строку, если оно установлено, или расширять раздел, когда текст не помещается в одну строку, если оно не установлено.
Если в программе установить свойство Visible панели в False, можно сделать невидимыми все элементы, которые в нем находятся. Стили, установленные в панели, наследуются всеми вложенными элементами.
Новая возможность в ASP .NET 2.0 — задавать для Panel полосы прокрутки, как бы имитируя встроенное в страницу окно. Это делается с помощью свойства ScrollBars. Он может принимать следующие значения: None, Both, Vertical, Horizontal, Auto.
Если вы установите его в Auto, полосы прокрутки появятся, когда содержимое панели не умещается в ее видимые размеры:
<asp:Panel ID="Panel1" runat="server" Height="140px" Width="494px" ScrollBars="Auto" HorizontalAlign="Left"> </asp:Panel> protected void Page_Load(object sender, EventArgs e) { for(int i=0;i<100;i++) { Literal l=new Literal(); l.Text = "Мой дядя самых честных правил,<br>Когда не в шутку занемог<br><br>"; this.Panel1.Controls.Add(l); } }
Реализуется такая возможность с помощью атрибута css overflow:
<div id="Panel1" style="height:140px;width:494px; overflow:auto;text-align:left;">
так что подобного поведения можно было добиться, просто изменив стиль. Но ведь не все из нас знают так хорошо css, чтобы иметь понятие об overflow.
Ставить свойство ScrollBars в Vertical или Horizontal я вам не рекомендую. Генерируется overflow-x, а это не работает в браузере Opera 9.0. overflow не поддерживается Opera 6.
Вертикальную полосу прокрутки можно установить и слева. Для этого поменяйте свойство Direction в RightToLeft.
Для Panel можно задать фоновую картинку с помощью свойства BackImageUrl.
RadioButton
Переключатели не ходят в одиночку. Один переключатель на странице не имеет смысла. Нужны хотя бы два. Типичный набор переключателей определяется так:
<asp:RadioButton ID="RadioButton1" Runat="server" Text="Yes" GroupName="Set1" /> <asp:RadioButton ID="RadioButton2" Runat="server" Text="No" GroupName="Set1"/>
Атрибут Text выводится справа от переключателя. В этом примере важно, что у обоих переключателей совпадает свойство GroupName. Это позволяет им работать как одно целое. Преимущество отдельных переключателей над RadioButtonList в том, что между переключателями можно поместить любой текст, картинки и другие элементы.
У RadioButton есть событие CheckedChanged, которое вызывается, когда пользователь выбирает один из переключателей группы. Чтобы обработчик этого события вызывался, необходимо установить свойство AutoPostBack:
<%@ Page Language="C#" %> <script runat="server">
protected void option1_CheckedChanged(object sender, EventArgs e) { if(option1.Checked) Message.Text = "Вы выбрали " + option1.Text; if (option2.Checked) Message.Text = "Вы выбрали " + option2.Text; if (option3.Checked) Message.Text = "Вы выбрали " + option3.Text; } </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Шуточное голосование</title> </head> <body> <br /><br /> У кого самые мохнатые лапы в мире?<br /><br /> <form runat="server" id="voting">
<asp:RadioButton id="option1" runat="server" Text="медведя" OnCheckedChanged="option1_CheckedChanged" AutoPostBack = true GroupName="Choice" /><br /> <asp:RadioButton id="option2" runat="server" Text=" мохноногого тушканчика" OnCheckedChanged="option1_CheckedChanged" GroupName="Choice" AutoPostBack = true /> <br /> <asp:RadioButton id="option3" runat="server" Text="хоббитов" OnCheckedChanged="option1_CheckedChanged" AutoPostBack = true GroupName="Choice"/><br /> <br /><br /> </form> <asp:Label id="Message" runat="server" /> </body> </html>
RadioButtonList
Группа переключателей работает так, что выбор одного элемента из группы снимает выбор с других. Этот элемент управления подходит для выбора одного правильного ответа из нескольких:
<asp:RadioButtonList id="radSample" runat="server"> <asp:ListItem id="option1" runat="server" value="Option A" /> <asp:ListItem id="option2" runat="server" value="Option B" /> <asp:ListItem id="option3" runat="server" value="Option C" /> </asp:RadioButtonList>
Свойство radSample.SelectedItem.Value показывает выбранный элемент.
На форуме RSDN каждый участник может открыть голосование по интересующему его вопросу. Вот одно из этих голосований:
<%@ Page Language="C#" %> <script runat="server"> void Page_Load() { if (Page.IsPostBack) { if( radVoting.SelectedItem==null) Message.Text = "Надо выбрать вариант"; else { Message.Text = "Спасибо за участие. Вы выбрали: " + radVoting.SelectedItem.Value; voting.Visible=false; } } } </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title> Что вы думаете о сайте intuit.ru? </title> </head> <body> <br /><br /> <asp:label runat="server" ID="Question" Font- Bold="True" Font-Size="Large" ForeColor="#0000C0">Что вы думаете об онлайн-университете intuit.ru? </asp:label> <br /><br /> <form runat="server" id="voting"> <asp:RadioButtonList id="radVoting" runat="server" > <asp:ListItem value="Хороший сайт, учился там" /> <asp:ListItem value="Есть интересные курсы, причем в открытом доступе" /> <asp:ListItem value="Не бывал(а), пойду посмотрю" /> <asp:ListItem value="Посмотрел(а), записался на курсы" /> </asp:RadioButtonList> <input type="Submit" value="Проголосовать!" > <br /><br /> </form> <asp:Label id="Message" runat="server" /> </body> </html>
Ну конечно, в случае настоящего голосования нужно еще и запомнить где-то результаты. Попробуем это освоить в следующих лекциях.
TextBox
Он заменяет элементы разметки <textbox> и <textarea>. Они оба вводят текст, только <textbox> — однострочный, а <textarea> — многострочный. Соответственно, при свойстве textmode, равном MultiLine, получится многострочное поле ввода, а при SingleLine — однострочное. Если textmode равен Password, введенные данные заменяются звездочками, как при <Input Type="Password">. Естественно, это нужно в основном для ввода пароля.
Свойство rows задается при textmode, установленном в MultiLine, и задает количество строк для ввода. Аналогично функционирует свойство columns — количество символов в строке.
Если свойство Wrap установлено, то текст переходит на новую строчку, чтобы полностью помещаться в окне. Эта возможность должна быть хорошо известна по текстовым редакторам:
<script runat="server" language="C#"> void Page_Load() { if (Page.IsPostBack) { if (txtName.Text != "") lblName.Text = "Вы ввели имя:" + txtName.Text; if (txtAddress.Text != "") lblAddress.Text = "Вы ввели адрес:" + txtAddress.Text; if (txtPassword.Text != "") lblPassword.Text = "Вы ввели пароль:" + txtPassword.Text + "<br>Спасибо за регистрацию!"; input.Visible = false; } }
</script>
<html xmlns=""http://www.w3.org/1999/xhtml""> <head> <title>Регистрация нового пользователя</title> </head> <body> <form runat="server" id="input"> <div style="text-align: left"> <table> <tr> <td style="width: 100px"> Введите имя: </td> <td style="width: 100px"> <asp:TextBox ID="txtName" runat="server" /></td> </tr> <tr> <td style="width: 100px"> Введите адрес:</td> <td style="width: 100px"> <asp:TextBox ID="txtAddress" runat="server" TextMode="multiline" Rows="5" Wrap="true" /></td> </tr> <tr> <td style="width: 100px"> Введите пароль:</td> <td style="width: 100px"> <asp:TextBox ID="txtPassword" runat="server" TextMode="password" /></td> </tr> </table> </div> <br /> <input type="Submit"><br /> </form> <br /> <asp:Label ID="lblName" runat="server" /><br /> <asp:Label ID="lblAddress" runat="server" /><br /> <asp:Label ID="lblPassword" runat="server" /><br /> </body> </html>
За счет манипулирования свойством видимости формы одна и та же страница выглядит совершенно по-разному до и после постбэка. На входе видна форма, а на выходе — результат, и так как форма скрыта, никакого кода для нее не генерируется.
Сохраните эту форму в файле Registration.aspx, мы к ней еще вернемся.
У всех классов, унаследованных от WebControl, в ASP .NET 2.0 появился метод Focus(). Он устанавливает фокус в элемент управления. Чаще всего применяется именно к TextBox. Добавьте txtName. Focus() в событие Page_Load(), и курсор при загрузке страницы уже будет установлен в нужной строке ввода.
в распоряжение программиста свойства, методы
Серверные элементы управления предоставляют в распоряжение программиста свойства, методы и события. При их помощи мы можем абстрагироваться от деталей HTML-кода и работать со страницей и ее элементами как с объектами. Мы рассмотрели часть серверных элементов управления. С новыми интересными элементами управления познакомимся в следующей лекции.