Практикум прикладного программирования на C# в среде VS.NET 2005

Управление HTML-элементами в ASP.NET

Показывать лекцию целиком

Файлы к лабораторной работе Вы можете скачать здесь.

Здесь мы займемся вопросами программирования типовых HTML-тегов, которые относятся к элементам пользовательского интерфейса на обычных HTML-страницах. Мы рассмотрим, как из пассивных элементов HTML сделать активные элементы ASP.NET и как ими можно управлять с использованием языка C#.

Элементы управления HTML и Web

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

Серверными элементы управления называются потому, что они тесно взаимодействуют с кодом, реализующим бизнес-логику (функциональность выполняемого кода) самого приложения, размещаемого на стороне сервера. Различают несколько групп серверных элементов управления:

  • HTML-элементы пользовательского интерфейса
  • Web-элементы пользовательского интерфейса
  • Элементы управления контроля и управления данными (невизуальные)
  • Элементы управления соединением и др. (невизуальные)
  • В этой работе мы познакомимся с серверными HTML-элементами управления. В библиотеке .NET Framework все пользовательские (интерфейсные) серверные элементы управления наследуют (являются наследниками) классу System.Web.UI.Control, а значит обладают рядом общих свойств и методов, определяющих их поведение.

    Элемент управления - это программный объект, отображаемый средой выполнения как часть графического элемента пользователя. Имея графическую среду разработки Visual Studio .NET, можно создавать Web-страницу, просто перетаскивая на нее элементы управления из панели Toolbox.

    Подобно локальным приложениям Windows, свойствами элементов можно управлять из кода программы. Это позволяет не только разделить HTML-разметку и логику программы, но и дает возможность дизайнерам и программистам работать над одним проектом относительно независимо. Отображаемую интерфейсную часть разрабатывают дизайнеры, а код управления этой частью реализуют программисты.

    Почти все элементы свитка HTML панели Toolbox дублируются элементами свитка Standard. Для чего? Для приемственности кода и сохранения привычек разработчиков, создающих Web-страницы еще до появления ASP.NET. Управлять такими элементами программно на языке C# (самостоятельная часть CodeBehind страницы) станет возможным, если к описывающим их тегам вручную добавлять атрибут runat="server". такая технология обеспечит сохранение возможности для HTML-элементов вначале применять привычные инструменты при разработки Web-страниц, например, HTML-редактор Dreamweaver, а затем готовые блоки кода переносить на ASP.NET-страницы.

    Элементы управления HTML

    Классы всех элементов управления HTML являются производными от System.Web.UI.HTMLControls.HTMLControl и находятся в пространстве имен System.Web.UI.HtmlControls. Любой HTML-тег можно превратить в элемент управления, добавив атрибут runat="server". Так мы сообщаем ASP.NET-процессору сервера, что код должен быть обработан им перед отправкой страницы на броузер пользователя. Разработчику, приспосабливающему обычные HTML-элементы управления в серверные необходимо помнить некоторые правила:

  • Строго соблюдать правило вложенности тегов, устраняя все пересечения блоков.
  • Добавлять в управляемые теги атрибут runat="server" или runat=server
  • Вместо дублирующего атрибута name использовать id
  • Давайте создадим последовательный набор связанных ссылками Web-страниц в формате ASP.NET, на каждой из которых будем размещать по одному серверному элементу управления и знакомиться с его свойствами. Все атрибуты, которые содержатся в HTML-тегах этих элементов, превратим в программно управляемые.

    Создание заготовки проекта ASP.NET

  • Создайте новый проект C# приложения ASP.NET в выбранном месте и задайте ему имя HTMLControls
  • После нажатия кнопки OK мастер создаст заготовку ASP.NET-приложения.

    Упражнение 1. Элемент управления HTMLAnchor

  • В панели Solution Explorer измените имя страницы с Default.aspx на HTMLAnchor.aspx
  • На открытой странице HTMLAnchor.aspx Web-формы в самом низу слева щелкните по кнопке Source, чтобы перейти из режима визуального проектирования в режим HTML-редактирования
  • Удалите код, который выделен ниже красным цветом (он нам пока не нужен)
  • <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="HTMLAnchor.aspx.cs" Inherits="_Default" %>
        
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            
        </div>
        </form>
    </body>
    </html>
  • Выполните проект и в строке состояния запущенного окна броузера убедитесь, что стоит результат Done - это означает, что ошибок в коде не обнаружено.
  • Отредактируйте HTML-код интерфейсной части страницы так, как показано ниже
  • <%@ Page Language="C#" AutoEventWireup="true"  
        CodeFile="HTMLAnchor.aspx.cs" Inherits="HTMLAnchor" %>
       
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Страница для испытания HTMLAnchor</title>
    </head>
    <body>
        <h1 align="center">
            Пример применения элемента управления HTMLAnchor</h1>
        <p>
        </p>
        <a id="PageLink" runat="server">Перейти к следующей странице</a>
    </body>
    </html>
  • Через меню оболочки View выполните команду Code (или через контекстное меню редактора команда View Code) и перейдите в режим редактирования сопровождающего ( CodeBehind ) файла на C# с именем HTMLAnchor.aspx.cs
  • Директивы страницы - это команды, которые использует компилятор при обработке страниц. Обратите внимание на первую строку кода в последнем листинге, в которой находится директива @Page страницы. Она устанавливает общие свойства страницы, в том числе в ней находится свойство CodeFile с установленным значением HTMLAnchor.aspx.cs. Это свойство указывает, что страница обслуживается кодом C#, размещенным в сопровождающем файле HTMLAnchor.aspx.cs.

  • Внесите в файл кодовой части страницы добавления, показанные ниже
  • using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
        
    public partial class HTMLAnchor : System.Web.UI.Page 
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            PageLink.HRef = "~/HTMLButton.aspx";
        }
    }

    Обратите внимание, что знак '~' в URL-адресе ссылки обозначает корневой узел проекта сайта.

  • Постройте и выполните приложение. Должен получиться такой результат
  • Наведите курсор на ссылку и убедитесь в строке состояния, что ссылка показывает полный адрес URL. Причем, к элементу тега ссылки мы обращаемся как к объекту по его идентификатору. Если щелкнуть по ссылке, то броузер выдаст ошибку с сообщением "The resource cannot be found" - "Ресурс не может быть найден", поскольку мы заложили ссылку на страницу, к созданию которой сейчас только приступим.
  • Таким образом, стандартный тег ссылки, используемый в старых HTML-документах, мы превратили в активный объект, с которым можно выполнять нужные манипуляции в сопровождающем страницу коде C#.

    Упражнение 2. Элемент управления HTMLButton

    Приступим к демонстрации управления кнопкой как объектом. Чаще всего кнопки применяются в составе HTML-форм (теги <form>...</form> и предназначены для отправки данных на сервер или восстановления значений полей данных в исходное состояние. В традиционном HTML-коде кнопки по их функциональному назначению бывают трех типов:

  • Button - кнопка без закрепленной функциональности
  • Submit - отправить данные полей на сервер
  • Reset - восстановить начальные значения полей данных формы
  • Перейдите в панель Solution Explorer и вызовите для нее контекстное меню, щелкнув правой кнопкой мыши на корневом узле проекта. Выполните команду Add New Item/Web Form, чтобы создать новую ASP.NET-страницу с именем HTMLButton.aspx
  • Обратите внимание на включенный флажок "Place code in separate file" - разместить код в отдельном файле, который требует, чтобы мастер оболочки создал наряду с интерфейсной страницей еще и кодовый файл.

  • Отредактируйте интерфейсную часть странице следующим образом
  • <%@ Page Language="C#" AutoEventWireup="true" 
        CodeFile="HTMLButton.aspx.cs" Inherits="HTMLButton" %>
        
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Страница для испытания HTMLButton</title>
    </head>
    <body>
        <h1 align="center">
            Пример применения элемента управления HTMLButton</h1>
        <center>
            <form id="Form1" runat="server">
                <br />
                <samp id="sampID" runat="server">
                    Текстовая метка по умолчанию</samp>
                <br />
                <br />
                <input id="Message1" runat="server" type="button" value="Текст1">
                nbsp;nbsp;nbsp;
                <input id="Message2" runat="server" type="button" value="Текст2">
            </form>
            <a id="PrevLink" runat="server">Назад</a> 
            nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; 
            <a id="NextLink" runat="server">Вперед</a>
        </center>
    </body>
    </html>
  • Перейдите в режим дизайна страницы HTMLButton.aspx и двойным щелчком на каждой кнопке создайте для них обработчики в сопровождающем кодовом файле HTMLButton.aspx.cs
  • Отредактируйте файл HTMLButton.aspx.cs так
  • using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
        
    public partial class HTMLButton : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            NextLink.HRef = "~/HTMLGeneric.aspx";
            PrevLink.HRef = "~/HTMLAnchor.aspx";
        }
        
        protected void Message1_ServerClick(object sender, EventArgs e)
        {
            sampID.InnerHtml = "Это строка текста номер 1";
        }
        
        protected void Message2_ServerClick(object sender, EventArgs e)
        {
            sampID.InnerHtml = "А вот это другой текст номер 2";
        }
    }
  • Постройте и выполните страницу, чтобы убедиться, что она работает. Неразрешенная ссылка "Вперед" отправляет на еще не созданную страницу, построением которой мы займемся сейчас. Выполненная страница должна выглядеть так
  • Обратите внимание, что при первой загрузке каждой новой страницы происходит задержка выполнения, но при повторных переходах по ссылкам задержки нет. При загрузке новой страницы среда выполнения CLR производит компиляцию с промежуточного языка MSIL в машинный язык, а при повторных переходах по ссылкам срабатывает кэш IIS-сервера.

    Обратите внимание еще вот на что. Если не щелкать по кнопкам страницы HTMLButton.aspx, а после ее открытия броузером воспользоваться кнопкой броузера Back (вверху слева), то перейдем сразу на предыдущую страницу HTMLAnchor.aspx. Если же прежде пощелкать по нашим кнопкам страницы HTMLButton.aspx, то количество переходов по кнопке Back броузера увеличивается. Отсюда следует, что поскольку броузер запоминает историю (объект History) для каждой новой страницы, то при каждом щелчке по кнопкам управления с сервера посылается совершенно новая страница.

    Упражнение 3. Программирование тегов класса HtmlGenericControl

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

    Технология такая: в объявление тега вставляют идентификатор, а в коде поддержки обращаются к его свойствам через параметр Attributes. Продемонстрируем это на примере.

  • Добавьте к проекту еще одну ASP.NET-страницу с именем HTMLGeneric.aspx так, как мы это делали для создания предыдущей страницы HTMLButton.aspx
  • Откройте интерфейсный файл HTMLGeneric.aspx и переведите его в режим редактирования Source
  • Удалите весь автоматически сгенерированный текст и введите код, приведенный ниже
  • <%@ Page Language="C#" AutoEventWireup="true" 
        CodeFile="HTMLGeneric.aspx.cs" Inherits="HTMLGeneric" %>
        
    <html>
    <head>
        <title>Страница для испытания HTMLGenericControl</title>
    </head>
    <body id="BodyID" runat="server">
        <h1 align="center">
            Пример программирования элементов класса HTMLGenericControl</h1>
        <center>
            <form id="form1" runat="server">
                <p>
                    Блок изменения цвета фона страницы</p>
                <p>
                    <samp>
                        Цвет фона:
                    </samp>
                    <select id="PageColor" runat="server">
                        <option selected value="#FFFFFF">Белый</option>
                        <option value="#FF0000">Красный</option>
                        <option value="#00FF00">Зеленый</option>
                        <option value="#0000FF">Синий</option>
                        <option value="#9900FF">Фиолетовый</option>
                        <option value="#FFFF00">Желтый</option>
                        <option value="#CCCCCC">Серый</option>
                    </select>
                </p>
                <p>
                    <input id="ColorButton" runat="server" type="submit" value="Изменить цвет фона" />
                </p>
                <hr>
                <font id="FontID" runat="server">Текстовая метка переменного размера</font>
                <p>
                    <samp>
                        Размер текста:
                    </samp>
                    <select id="FontSize" runat="server" name="FontSize">
                        <option selected value="1">Small</option>
                        <option value="2">Medium</option>
                        <option value="4">Large</option>
                        <option value="5">Extra Large</option>
                    </select>
                </p>
                <p>
                    <input id="SizeButton" runat="server" type="submit" value="Изменить размер шрифта" />
                </p>
                <hr>
                <p>
                    Программирование тега параграфа</p>
                <p id="Text0" runat="server">
                    Нажмите на кнопку и сервер добавит две новых строки</p>
                <p id="Text1" runat="server">
                </p>
                <p id="Text2" runat="server">
                </p>
                <p>
                    <input id="AddButton" runat="server" type="submit" value="Добавить строки" />
                </p>
            </form>
            <hr>
            <a id="PrevLink" runat="server">Назад</a> 
                nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; 
            <a id="NextLink" runat="server">Вперед</a>
        </center>
    </body>
    </html>
  • Переведите страницу HTMLGeneric.aspx в режим Design и последовательно двойным щелчком на кнопках пользовательского интерфейса создайте для них обработчики
  • Откройте файл HTMLGeneric.aspx.cs и запрограммируйте обработчики как показано ниже
  • using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
        
    public partial class HTMLGeneric : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            NextLink.HRef = "~/HTMLImage.aspx";
            PrevLink.HRef = "~/HTMLButton.aspx";
        }
        
        static private bool textFlag = false;
        
        protected void ColorButton_ServerClick(object sender, EventArgs e)
        {
            BodyID.Attributes["bgcolor"] = PageColor.Value;
        }
        
        protected void SizeButton_ServerClick(object sender, EventArgs e)
        {
            FontID.Attributes["size"] = FontSize.Value;
        }
        
        protected void AddButton_ServerClick(object sender, EventArgs e)
        {
            if (!textFlag)
            {
                Text0.InnerHtml = "Нажмите на кнопку и сервер уберет две новых строки";
                Text1.InnerHtml = "<h1><font color='red'>Привет студентам от Снеткова В.М.!!!</font></h1>";
                Text2.InnerHtml = "<h1><font color='blue'>Идите! И Вы победите!!!</font></h1>";
                AddButton.Value = "Убрать строки";
                textFlag = true;
            }
            else
            {
                Text0.InnerHtml = "Нажмите на кнопку и сервер добавит две новых строки";
                Text1.InnerHtml = "";
                Text2.InnerHtml = "";
                AddButton.Value = "Добавить строки";
                textFlag = false;
            }
        }
    }
  • Войдите в панель Solution Explorer и щелкните правой кнопкой мыши на узле HTMLGeneric.aspx. В появившемся контекстном меню выполните команду Set As Start Page, чтобы эта страница запускалась при компиляции первой (для удобства отладки)
  • Постройте проект и проверьте функциональность разработанной страницы
  • Должно получиться примерно следующее

    Упражнение 4. Элемент управления HTMLImage

    Элемент управления HTMLImage позволяет программировать HTML-тег <img>. Этот тег используется для добавления изображений в документы HTML. В качестве примера программирования этого тега разработаем ASP.NET-страницу, при запуске которой будет выводиться базовое изображение. Затем из раскрывающегося списка это изображение можно будет сменить на другое, заранее нами заготовленное.

    Логику управления рисунками страницы разместим в отделенном кодовом файле CodeBehind, в котором на основе предпочтений пользователя будем устанавливать атрибуты элемента управления рисунком. Одно из свойств будем задавать так, чтобы при наведении мыши на рисунок пользователю выдавался соответствующий заголовок.

  • Добавьте к существующему проекту еще одну ASP.NET-страницу с именем HTMLImage.aspx через контекстное меню в панели Solution Explorer, вызванное для узла всего проекта
  • Сделайте ее стартовой для удобства отладки, как мы это делали с предыдущей страницей
  • Добавьте к корневому узлу проекта каталог Image командой контекстного меню New Folder
  • Создайте три рисунка PNG-формата с именами: image1.png, image2.png, image3.png одинаковых размеров (чтобы не прыгали элементы страницы при просмотре) и поместите их в каталог Images командой контекстного меню Add Existing Item
  • Рисунки можно взять в каталоге Source данной работы. Формат рисунков может быть и иным или они могут размещаться и в другом месте логического каталога, но тогда необходимо скорректировать соответствующий код страницы, изменив расширения файлов и прописав пути размещения.

  • Откорректируйте страницу HTMLImage.aspx так, как показано ниже
  • <%@ Page Language="C#" AutoEventWireup="true" 
        CodeFile="HTMLImage.aspx.cs" Inherits="HTMLImage" %>
        
    <html>
    <head>
        <title>Программирование элемента HTMLImage</title>
    </head>
    <body>
        <center>
            <form id="Form1" runat="server" method="post">
                <h2 align="center">
                    Управление элементом HTMLImage</h2>
                <font color="red">
                    <p id="PictureTitle" runat="server" />
                </font>
                <img id="Image" runat="server" />
                <p>
                </p>
                <samp>
                    Выберите рисунок:
                </samp>
                <select id="SelectPicture" runat="server" >
                    <option selected value="1">1. Я любимый!</option>
                    <option value="2">2. Петрович дорогой!</option>
                    <option value="3">3. Друг сердечный!</option>
                </select>
                <p>
                    <input id="PictureButton" runat="server" type="submit" 
                           value="Загрузить рисунок" />
                </p>
            </form>
            <hr>
            <a id="PrevLink" runat="server">Назад</a> 
               nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; 
            <a id="NextLink" runat="server">Вперед</a>
        </center>
    </body>
    </html>
  • В режиме Design двойным щелчком на кнопке PictureButton создайте для нее обработчик и откорректируйте файл отделенного кода HTMLImage.aspx.cs так, как показано ниже
  • using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
        
    public partial class HTMLImage : System.Web.UI.Page
    {
        // Должно быть соотношение 3/2, но жалко резать рисунки!!!
        const int WIDTH = 500, HEIGHT = 375;
        string[] messages = {
    			"<h2>Это - Я любимый!!!</h2>",
    			"<h2>Это - Петрович дорогой!!!</h2>",	
    			"<h2>А это - Друг сердечный!!!</h2>"	  
    	};
        
        protected void Page_Load(object sender, EventArgs e)
        {
            PictureTitle.InnerHtml = messages[0];
            Image.Width = WIDTH;
            Image.Height = HEIGHT;
            Image.Border = 1;
            Image.Src = "Images/image1.png";
            PrevLink.HRef = "HTMLGeneric.aspx";
            NextLink.HRef = "~/HTMLInputButton.aspx";
        }
        
        protected void PictureButton_ServerClick(object sender, EventArgs e)
        {
            string pictureChoice = SelectPicture.Value;
        
            switch (pictureChoice)
            {
                case "1":
                    PictureTitle.InnerHtml = messages[0];
                    Image.Src = "Images/image1.png";
                    break;
                case "2":
                    PictureTitle.InnerHtml = messages[1];
                    Image.Src = "~/Images/image2.png";
                    break;
                default:// За все отвечает мент
                    PictureTitle.InnerHtml = messages[2];
                    Image.Src = "~/Images/image3.png";
                    break;// Нужно, требует синтаксис
            }
        }
    }
  • Постройте проект и проверьте функциональность разработанной страницы. Должно получиться примерно следующее
  • Упражнение 5. Элемент управления HTMLInputButton

    Элемент управления HTMLInputButton позволяет программировать HTML-теги

  • <input type="submit">
  • <input type="reset">
  • <input type="button">
  • Эти теги используются для отображения функциональных кнопок в документах HTML. Они должны входить в состав HTML-формы и, как только пользователь нажимает кнопку отправки формы, данные заданным в атрибуте формы методом ( GET, POST, SOAP ) отсылаются на сервер для обработки.

    Разработаем активную ASP.NET-страницу, в которой подтверждаются права доступа пользователя на основании его имени и пароля (учетной записи). Страницу для разнообразия создадим на основе HTML-файла с совмещенным кодом, где код C# вставим прямо в саму страницу.

  • Через контекстное меню в панели Solution Explorer, вызванное для узла всего проекта, добавьте командой Add New Item новую HTML-страницу с именем HTMLInputButton.aspx выбрав шаблон HTML Page
  • Сделайте новую страницу стартовой для удобства отладки через контекстное меню панели Solution Explorer командой Set As Start Page
  • Мы видим, что мастер создал заготовку интерфейсной части для обычной статической страницы. Наша задача - превратить эту страницу в активную серверную, причем код на C# будет размещен на этой же странице, а не в отделенном файле, как это делалось ранее.

  • Отредактируйте интерфейс пользователя на странице HTMLInputButton.aspx следующим образом (в том числе добавьте директиву @ Page в начало файла)
  • <%@ Page Language="C#" %>
        
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
        <title>Untitled Page</title>
    </head>
    <body>
        <h1 align="center">
            Управление элементом HTMLInputButton</h1>
        <center>
            <form id="form1" runat="server" method="post">
                <h2>
                    <font color="red">
                        <samp id="sampID" runat="server">
                            Подменяемый текст</samp>
                    </font>
                </h2>
                <p>
                </p>
                Имя пользователя:
                <input id="Username" runat="server" type="text" value="DefaultUser" />
                <p>
                </p>
                Пароль:
                <input id="Password" runat="server" type="password">
                <p>
                </p>
                <input id="SubmitButton" runat="server"
                       type="submit" value="Submit Query" />
                    nbsp;nbsp;nbsp;
                <input id="ResetButton" runat="server" type="button" value="Reset" />
            </form>
            <hr>
            <a id="PrevLink" runat="server">Назад</a> 
                nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; 
            <a id="NextLink" runat="server">Вперед</a>
        </center>
    </body>
    </html>

    Обратите внимание, что все HTML-элементы, которыми мы хотим программно управлять, помечены атрибутом runat="server", то есть будут активно обрабатываться средой исполнения ASP.NET.

    Здесь есть одна тонкость, которая может проявиться... Когда мы создали страницу как статическую по шаблону HTML Page, а потом дописали директиву @ Page как для активной страницы, то редактор все равно будет воспринимать ее статической и выдавать ошибки. Поэтому, после написания директивы @ Page страницу нужно закрыть, а затем вновь открыть, чтобы редактор настроился на код активной страницы.

    Визуальное представление страницы HTMLInputButton.aspx в броузере клиента будет таким

  • Перейдите в режим Design редактирования страницы и двойным щелчком мыши на пустом месте Web-формы (вне интерфейсных элементов управления) создайте блок кода и заготовку обработчика события Load на той же самой интерфейсной странице
  • Подобным образом создайте обработчики для кнопок SubmitButton и ResetButton, и заполните все обработчики в кодовой части страницы как показано ниже
  • <script runat="server">
        static bool flag = true;
        
        protected void Page_Load(object sender, EventArgs e)
        {
            sampID.InnerText = "Введите учетную запись для регистрации";
            Username.Size = 20;
            Password.Size = 10;
            Username.MaxLength = 30;
            Password.MaxLength = 30;
            PrevLink.HRef = "HTMLImage.aspx";
            NextLink.HRef = "HTMLInputCheckBox.aspx";
        }
        
        protected void SubmitButton_ServerClick(object sender, EventArgs e)
        {
            if (Username.Value == "Иванов"
                 Password.Value.ToUpper() == "SA")
                sampID.InnerText =
                    "Приветствуем Вас, наш дорогой "
                    + Username.Value.ToUpper() 
                    + ", как зарегистрированного Пользователя!!!";
            else
                sampID.InnerText =
                    "Уходите! Вам не разрешено пользоваться этим ресурсом!";
        }
        
        protected void ResetButton_ServerClick(object sender, EventArgs e)
        {
            sampID.InnerText = "Введите учетную запись для регистрации";
            Username.Value = "DefaultUser";
        }
    </script>
  • Запустите приложение и проверьте его работоспособность. Попытайтесь разобраться в коде
  • В данном упражнении мы несколько обычных HTML-элементов интерфейсной части страницы превратили в серверные, дополнив их атрибутом runat="server" и уникальным идентификатором id. Такое действие равносильно созданию экземпляров классов поддержки этих элементов с именами, указанными в атрибутах id. Это дало возможность управлять объектами через их обработчики событий, которые выполняются перед генерацией HTML-отклика активной страницы (рендерингом), и формировать нужный HTML- и JavaScript-код, посылаемый клиенту.

    Главный вывод здесь такой: когда в серверной странице имеется чистый HTML-код элементов, то по запросу он не будет обрабатываться средой исполнения, а в неизменном виде будет отправлен клиенту. Но стоит вставить внутрь дескриптора HTML-элемента атрибут runat="server" и идентификатор id, то это равносильно созданию экземпляра поддерживающего этот элемент класса, и функциональностью такого экземпляра уже можно управлять в обработчиках событий.

    Нам, как программистам, для управления таким HTML-элементом, превращенным в активный, не обязательно знать, какой поддерживающий класс стоит за ним. Мы будем иметь дело только с id этого элемента и при программировании подсказчик кода IntelliSense покажет доступные свойства и события. Хотя, при наведении курсора на имя объекта в кодовой части страницы всплывающая подсказка сообщит имя поддерживающего этот объект класса

    Упражнение 6. Элемент управления HTMLInputCheckBox

    Класс HTMLInputCheckBox позволяет программировать HTML-тег <input type="CheckBox">. Этот тег используется в HTML-документах для моделирования работы флажка, который может быть отмеченым или неотмеченным. Разработаем страницу, в которой будем проверять, отмечен флажок или нет.

  • Через меню оболочки Website/Add New Item добавьте к проекту новую страницу с отделенным кодом и именем HTMLInputCheckBox.aspx
  • Сформируйте интерфейсную часть страницы HTMLInputCheckBox.aspx, чтобы она выглядела так
  • <%@ Page Language="C#" AutoEventWireup="true" 
        CodeFile="HTMLInputCheckBox.aspx.cs" 
        Inherits="HTMLInputCheckBox" %>
        
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>HTMLInputCheckBox</title>
    </head>
    <body>
        <center>
            <h1>
                Элемент управления HTMLInputCheckBox
            </h1>
            <p id="StateCheck" runat="server">
            </p>
            <form id="form1" runat="server" method="post">
                <p>
                    Сделайте свой выбор:
                    <input id="checkBox" runat="server" type="CheckBox">
                </p>
                <p>
                    <input id="SubmitButton" runat="server" type="submit" 
                           value="Submit Query">
                </p>
            </form>
            <hr>
            <a id="PrevLink" runat="server">Назад</a> 
                nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; 
            <a id="NextLink" runat="server">Вперед</a>
        </center>
    </body>
    </html>
  • Двойным щелчком на кнопке SubmitButton в режиме Design создайте для нее обработчик
  • Сформируйте код C# управляющей части CodeBehind страницы в файле HTMLInputCheckBox.aspx.cs, чтобы он выглядел так
  • using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
        
    public partial class HTMLInputCheckBox : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            PrevLink.HRef = "HTMLInputButton.aspx";
            NextLink.HRef = "HTMLInputFile.aspx";
            SubmitButton.Value = "Показать состояние CheckBox";
        }
        
        protected void SubmitButton_ServerClick(object sender, EventArgs e)
        {
            if (checkBox.Checked)
                StateCheck.InnerHtml = "<h2>CheckBox включен</h2>";
            else
                StateCheck.InnerHtml = "<h2>CheckBox выключен</h2>";
        }
    }
  • Сделайте новую страницу стартовой и постройте проект
  • Результат внешне будет примерно таким

    Упражнение 7. Элемент управления HTMLInputFile

    Класс HTMLInputFile позволяет программировать HTML-тег <input type="file">. Этот тег используется для работы с данными файла в пределах формы HTML. В теге <form> мы будем использовать атрибут enctype="multipart/form-data", без которого Web-страница выдаст ошибку. В нашем сценарии при нажатии кнопки страница будет загружать файл на сервер и выдаст сообщение при успешном завершении, в противном случае она должна отображать сообщение об ошибках, указывающих на причину сбоя.

    Встретив тег <input type="file">, броузер автоматически размещает кнопку Browse рядом с текстовым полем, чтобы дать возможность пользователю через диалоговое окно выбрать выгружаемый на сервер файл. Нажатие кнопки Open размещает имя выбранного файла и путь к нему в текстовом поле страницы.

  • Добавьте к проекту новую страницу (шаблон Web Form) с именем HTMLInputFile.aspx и файлом отделенного кода, назначьте ее стартовой для удобства отладки
  • Перейти из режима Design визуального проектирования в режим Source (то же самое можно сделать через меню оболочки View/Code или контекстное меню редактора страницы командой View Code )
  • Отредактируйте интерфейсную часть страницы HTMLInputFile.aspx так
  • <%@ Page Language="C#" AutoEventWireup="true" 
        CodeFile="HTMLInputFile.aspx.cs" Inherits="HTMLInputFile" %>
        
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
        <title>Элемент управления HTMLInputFile</title>
    </head>
    <body>
        <center>
            <h1>
                Элемент управления HTMLInputFile</h1>
            <font color="#ff0000">
                <h2 id="State" runat="server" />
            </font>
            <form id="form1" runat="server" 
                  enctype="multipart/form-data" method="post">
                Имя отсылаемого файла:nbsp; nbsp;
                <input id="FileName" runat="server" 
                       maxlength="30" type="file">
                <p />
                Переслать под именем (без пути):nbsp; nbsp;
                <input id="Text" runat="server" type="text">
                <p />
                <input id="TransferFile" runat="server" 
                       type="button" value="Передать файл">
            </form>
            <hr>
            <a id="PrevLink" runat="server">Назад</a> 
                nbsp;nbsp;nbsp;nbsp;nbsp;nbsp; 
            <a id="NextLink" runat="server">Вперед</a>
        </center>
    </body>
    </html>
  • Перейдите в режим дизайна страницы HTMLInputFile.aspx и двойным щелчком на кнопке TransferFile создайте обработчик в ассоциированном файле поддержки HTMLInputFile.aspx.cs
  • Отредактируйте файл поддержки HTMLInputFile.aspx.cs так
  • using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
        
    public partial class HTMLInputFile : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            PrevLink.HRef = "HTMLInputCheckBox.aspx";
            NextLink.HRef = "HTMLInputHidden.aspx";
        }
        
        protected void TransferFile_ServerClick(object sender, EventArgs e)
        {
            if (FileName.Value == "")
            {
                State.InnerHtml = "Выберите отсылаемый файл";
                return;
            }
            else if (Text.Value == "")
            {
                State.InnerHtml = "Введите имя целевого файла";
                return;
            }
        
            if (FileName.PostedFile != null)
            {
                try
                {
                    FileName.PostedFile.SaveAs("c:\  emp\\" + Text.Value);
                    State.InnerHtml = "Файл c:\  emp\\" +
                        Text.Value + " передан успешно на Web server";
                }
                catch (Exception exc)
                {
                    State.InnerHtml = "Ошибка записи файла c:\  emp\\" +
                        Text.Value + "<br>" + exc.ToString();
                }
            }
        }
    }
  • Постройте проект. Результат внешне будет примерно таким
  • Проверьте, действительно ли в целевом каталоге C:\TEMP появляется копия пересылаемого файла
  • Упражнение 8. Элемент управления HTMLInputHidden

    Этот класс позволяет программировать HTML-тег <input type="hidden">, который используется для скрытой передачи данных на сервер. Разработаем страницу, в которой сервер будет возвращать содержимое тега в открытом виде. Код управления объектом на C# разместим на странице вместе с интерфейсной частью.

  • Выполните команду меню оболочки для вызова мастера добавления в проект новой HTML-страницы с именем HTMLInputHidden.aspx
  • Расширение .aspx нужно для того, чтобы диспетчер страниц на стороне сервера при поступлении запроса от броузера на ее поставку, вначале передал страницу на обработку IIS-серверу.

  • Установите режим Source редактирования новой страницы и заполните ее кодом, приведенным ниже (интерфейсная и кодовая части на одной странице)
  • <script runat="server" language="C#">
           void ButtonShow_Click(object Source, EventArgs e) 
           {
    			State.InnerText = HiddenField.Value;
           }
     	
           void ButtonHidden_Click(object Source, EventArgs e) 
           {
    			State.InnerText = "";
           }
    </script>
        
    <html>
    <head>
        <title>Элемент управления HTMLInputHidden</title>
    </head>
    <body>
        <center>
            <h1>
                Элемент управления HTMLInputHidden</h1>
            <font color="#ff0000">
                <h2 id="State" runat="server" />
            </font>
            <form id="form1" runat="server" method="post">
                <p>
                    Нажмайте на кнопки для показа/сокрытия секретной информации</p>
                <input id="ShowButton" runat="server" 
                    onserverclick="ButtonShow_Click" type="button"
                    value="Показать секретную информацию">
                <p>
                </p>
                <input id="HiddenButton" runat="server" 
                    onserverclick="ButtonHidden_Click" type="button"
                    value="Скрыть секретную информацию">
                <input id="HiddenField" runat="server" type="hidden" 
                    value="Это скрытое значение поля Hidden">
            </form>
            <hr>
            <a href="HTMLInputFile.aspx">Назад</a> 
                nbsp;nbsp;nbsp;nbsp;
            <a href="HTMLInputImage.aspx">Вперед</a>
        </center>
    </body>
    </html>
  • Сделайте страницу стартовой и постройте приложение. Результат должен быть таким
  • В этой странице мы не стали создавать ассоциированный файл CodeBehind для тренировки, хотя смешивать представление страницы и код управления ею не совсем удобно. Да и возможности по программированию в чисто кодовом файле C# привычнее. Мы, как программисты, внутри файла CodeBehind находимся в своей стихии и можем спокойно там расположить всю бизнес-логику управления представлением. Главное - чтобы были известны идентификаторы всех элементов управления, используемых на странице представления.

    Визуальный способ проектирования страницы представления

    Дойдя до этого места, вам, возможно, уже надоело смотреть на HTML-код. Но оболочка дает возможность применить привычный визуальный способ проектирования дизайна Web-страницы - через панель Toolbox, чем мы в дальнейшем и воспользуемся.

    Мы по-прежнему будем добавлять к проекту страницы Web Form, но прежде, чем редактировать ассоциированный файл CodeBehind напрямую, нужно полностью определиться с дизайном страницы, именами и типами элементов. Манипуляции с интерфейсной частью страницы приводят к генерации кода в ассоциированном файле CodeBehind. Но код на C# вставляется в CodeBehind только при объявлении управляющих HTML-элементов серверными. Имена элементов нужно менять в режиме дизайна через панель Properties, в этом случае они автоматически сменятся в CodeBehind.

    Упражнение 9. Элемент управления HTMLInputImage

    Элемент управления HTMLInputImage позволяет программировать тег <input type="image">. Он обеспечивает загруженный на страницу рисунок функциональными возможностями кнопки типа submit. Для примера создадим страницу, на которой разместим с помощью этого элемента два изображения с функциональностью кнопок. При щелчке по одному из рисунков будем сообщать, какая кнопка была нажата.

  • Добавьте к проекту новую страницу типа Web Form с отделенным кодом и именем HTMLInputImage.aspx
  • Выполните команду меню оболочки View/Other Windows/Document Outline, чтобы вызвать панель Document Outline
  • Панель Document Outline является удобным средством навигации по элементам управления интерфейсной части страницы. Она отображает дерево дескрипторов страницы и щелчек на любом элементе в панели приводит к установке курсора на открывающий дескриптор соответствующего элемента, а панели Properties отображаются свойства выделенного элемента.

    И наоборот, при вызове в режиме Source контекстного меню для курсора, установленного на каком-либо дескрипторе, и выполнении команды Synchronize Document Outline происходит локализация соответствующего узла в панели Document Outline.

  • Перейдите в режим Source-редактирования и подкорректируйте файл HTMLInputImage.aspx так
  • <%@ Page Language="C#" AutoEventWireup="true" 
        CodeFile="HTMLInputImage.aspx.cs" 
        Inherits="HTMLInputImage" %>
        
    <html>
    <head>
        <title>Элемент управления HTMLInputImage</title>
    </head>
    <body>
        <center>
            <h1>
                Программирование элемента HTMLInputImage</h1>
            <form id="form1" runat="server" method="post">
                <h2 id="Text" runat="server">
                </h2>
            </form>
            <a href="HTMLInputHidden.aspx">Назад</a> 
                nbsp;nbsp;nbsp;nbsp;
            <a href="HTMLInputRadioButton.aspx">Вперед</a>
        </center>
    </body>
    </html>

    Поместить компоненты на Web-форму можно двумя способами:

  • Выполнить двойной щелчок на компоненте и компонент разместится в верхем левом углу Web-формы.
  • Захватить компонент мышью и поместить его в нужное место на Web-форме.
  • Оставаясь в режиме Source, выберите в панели Toolbox вкладку HTML и поместите внутрь дескрипторов <form></form> (в самом конце блока) два элемента Image, раздвинув их жесткими пробелами nbsp;
  • Блок приобретет примерно такой вид:

    <form id="form1" runat="server" method="post">
                <h2 id="Text" runat="server">
                </h2>
                <img src="" />
                    nbsp;nbsp;nbsp;nbsp;
                <img src="" />
            </form>
  • Щелкните правой кнопкой мыши на свободном месте панели инструментов (вверху, после меню) оболочки для вызова контекстного меню (или выполните команду Tools/Customize) и включите панель инструментов Dialog Editor
  • Этой панелью следует пользоваться для выравнивания компонентов в режиме абсолютного позиционирования компонентов Web-формы, но не в нашем случае.

  • Поместите на страницу ниже завершающего маркера формы </form> компонент Horizontal Rule
  • В режиме Design последовательно вызовите для каждого HTML-компонента Image контекстное меню и выполните в нем команду Run As Server Control
  • Оболочка добавит к дескрипторам <img> атрибут runat="server". Слева над изображением компонента появится зеленый маркер, свидетельствующий, что компонент является программируемым на стороне сервера.

    После этих манипуляций внешнее представление Web-страницы в режиме Design должно выглядеть так

  • Заготовьте два небольших рисунка одинакового размера для этих кнопок (можно взять в каталоге Source данной работы) и разместите их файлы под именами Button1.png и Button2.png в папке Images проекта
  • Через панель Document Outline выделите последовательно компоненты рисунков и в панели Properties через диалоговое окно подключите к свойству Src (Source-источник) соответствующие рисунки
  • >

    После подключения рисунков к HTML-элементам <img> визуальное представление страницы на этапе проектирования станет таким

  • Перейдите в режим Source и измените дескрипторы <img> на <input type="image">
  • Окончательно строки HTML-кода отображения рисунков-кнопок должны выглядеть так

    <input type="image" id="IMG1" src="Images/Button1.png" runat="server" />
                    nbsp;nbsp;nbsp;nbsp;
                <input type="image" id="IMG2" src="Images/Button2.png" runat="server" />

    Будем считать, что с дизайном страницы мы закончили и построили ее интерфейсную часть. Теперь приступим к программированию этого дизайна на языке C#.

  • Через меню View (команда Code) или контекстное меню Web-формы (команда View Code ) откройте на редактирование ассоциированный файл (CodeBehind) с именем HTMLInputImage.aspx.cs
  • Перейдите на страницу HTMLInputImage.aspx в режим Design и двойным щелчком на каждой кнопке-рисунке создайте обработчики в ассоциированном файле
  • Отредактируйте обработчики так
  • protected void IMG1_ServerClick(object sender, ImageClickEventArgs e)
        {
            Text.InnerHtml = "<font color=red>" +
                "Вы щелкнули по левой кнопке! </font>";
        }
        
        protected void IMG2_ServerClick(object sender, ImageClickEventArgs e)
        {
            Text.InnerHtml = "<font color=#0000ff>" +
                "Вы щелкнули по правой кнопке! </font>";
        }
  • Назначьте страницу HTMLInputImage.aspx стартовой, постройте приложение и убедитесь в его работоспособности
  • Страница внешне должна выглядет так

    Упражнение 10. Элемент управления HTMLInputRadioButton

    Элемент управления HTMLInputRadioButton - переключатель позволяет программировать HTML-тег <input type="radio">. Этот тег дает возможность пользователю делать выбор в пределах документа HTML. В отличие от флажков, которые можно установить во включенное состояние сразу несколько, переключатель позволяет выбрать только один элемент из группы.

    Рассмотрим его программирование на примере. Создадим страницу с двумя группами переключателей, где все входящие в группу переключатели должны иметь одинаковое имя id (или name). При нажатии управляющей кнопки Submit броузер передаст данные на сервер, где управляющий код проверит, какой из переключателей включен и вернет броузеру страницу с соответствующим сообщением.

    Иногда интерфейсную часть страницы удобнее разработать в специализированном Web-редакторе, чем средствами оболочки. Поэтому для тренировки следующую страницу создадим в Web-редакторе Macromedia Dreamweaver MX 2004, а затем готовый HTML-код перенесем на ASP.NET страницу, где создадим для него управление на C#.

    Подготовка HTML-кода в редакторе Dreamweaver

  • Запустите редактор Dreamweaver и в его меню выполните команду Edit/Preferences. Появится окно свойств, в котором установите настройку кодировки при создании новых документов на Кириллица (Windows)
  • >

  • Создайте новый HTML-документ через меню File/New (можно сразу его где-нибудь сохранить как временный)
  • >

  • Напишите первую отображаемую строку и в панели свойств присвойте ей значение Heading1 из раскрывающегося списка Format
  • >

  • Введите следующую строку текста с надписью
  • Выберите нужный цвет:

  • Переведите курсор на новую строку и выполните команду меню Insert/Tag... Появится диалоговое окно Tag Chooser, из которого выберите тег радиокнопки, как показано на рисунке
  • После нажатия кнопки Insert в дополнительном окне выберите вкладку General, введите в поле Name имя кнопки colorRadio (цвет) и отметьте флажок Checked для этой первой кнопки, чтобы при загрузке страницы эта кнопка была включена. Затем, не выходя из окна Tag Editor - Input, выберите вкладку Style Sheet/Accessibility и в поле ID введите значение radio1. Повторите эту процедуру для создания еще двух кнопок с тем же именем colorRadio, но с ID: radio2 и radio3. Флажок Checked не поднимайте.
  • Продолжите создание еще двух кнопок, но теперь полю Name присвойте значение fruitRadio (фрукт) и для первой кнопки поднимите флажок Checked. Полю ID присвойте значения radio4 и radio5. По этим значениям мы будем управлять кнопками в коде C#
  • Вставьте пустую строку перед созданными радиокнопками и через меню Insert/Table вызовите окно настройки вставляемой таблицы. Таблицу мы создали для позиционирования группы из трех кнопок
  • Перетащите курсором в ячейки таблицы первые три радиокнопки, затем справа от них введите три надписи Red (красный), Green (зеленый), Blue (синий).
  • Ниже создайте еще одну строку и введите текст
  • Выберите нужный фрукт:

  • Ниже для позиционирования создайте еще одну таблицу с одной строкой и двумя столбцами, переместите туда две оставшиеся радиокнопки и добавьте надписи Бананы и Апельсины.
  • Еще ниже вставьте кнопку Submit прежним же способом
  • Поле Name оставьте пустым, поле Value заполните значением Показать результат, в поле ID введите SubmitButton
  • Ниже кнопки вставьте тег горизонтальной черты
  • Еще ниже вставьте две гиперссылки с названиями Назад и Вперед и относительными URL-адресами на предыдущую и следующую страницы
  • HTMLInputImage.aspx
         HTMLInputText.aspx

  • Вставьте после ссылок таблицу из двух строк и двух столбцов. Выделите первую строку и объедините ячейки через контекстное меню
  • Заполните первую строку текстом
  • Результаты вычислений

    а в ячейки нижней строки вставьте по тегу h2 со значениями ID: colorText и fruitText соответственно

  • Вставьте перед самой верхней строчкой страницы дескриптор <form>
  • Перейдите в режим редактирования кода и перенесите закрывающую часть </form> в конец кода перед дескриптором </body>. При этом важно чтобы вложенность пар дескрипторов не нарушилась. Перейдите в режим Design и убедитесь, что все окно обрамлено красной пунктирной рамкой - областью действия формы
  • Щелкните мышью где-нибудь на основном тексте и через меню выполните команду Edit/Select All. В панели Properties кнопкой отцентрируйте все элементы HTML-страницы, щелкнув на кнопке Align Center
  • Измените цвет фона таблиц с радиокнопками. Для этого поместите курсор внутрь таблицы и в строке состояния окна редактирования щелкните по надписи <table>
  • Таблица выделится полностью и в образце Bg color можно задать цвет фона таблицы.

  • Сохраните страницу на диске и нажатием клавиши F12 запустите ее в броузере. Убедитесь, что пока все внешне нажимается, но функциональности нет. Но зато есть интерфейсная основа для программирования
  • Программирование функциональности страницы ASP.NET

  • Перейдите в Visual Studio .NET 2005 и откройте наш проект HTMLControls
  • Добавьте к проекту новую страницу с отделенным кодом и именем HTMLInputRadioButton.aspx, перейдите в режим редактирования Source и удалите весь автоматически сгенерированный мастером код, кроме директивы @ Page, выделенной желтым фоном
  • Вернитесь в Dreamweaver, где мы разработали интерфейсную часть страницы, и переведите редактор в режим Code
  • HTML-код заготовки интерфейсной страницы tmp.htm будет иметь следующий вид

    <html>
    <head>
        <title>Элемент HTMLInputRadioButton</title>
        <meta content="text/html; charset=windows-1251" http-equiv="Content-Type">
    </head>
    <body>
        <form  method="post" name="form1">
            <center>
                <h1>
                    Элемент управления HTMLInputRadioButton</h1>
                <p>
                    Выберите нужный цвет:</p>
                <table bgcolor="#99ffff" border="0" width="100%">
                    <tr>
                        <td width="33%">
                            <input id="radio1"  checked="" name="colorRadio" type="radio" value="">
                            Red
                        </td>
                        <td width="33%">
                            <input id="radio2"  name="colorRadio" type="radio" value="">
                            Green
                        </td>
                        <td width="34%">
                            <input id="radio3"  name="colorRadio" type="radio" value="">
                            Blue
                        </td>
                    </tr>
                </table>
                <p>
                    Выберите нужный фрукт:</p>
                <table bgcolor="#99ff66" border="0" width="100%">
                    <tr>
                        <td width="50%">
                            <input id="radio4"  checked="" name="fruitRadio" type="radio" value="">
                            Бананы
                        </td>
                        <td width="50%">
                            <input id="radio5"  name="fruitRadio" type="radio" value="">
                            Апельсины
                        </td>
                    </tr>
                </table>
                <input id="SubmitButton"  name="" type="submit" value="Показать результат">
                <hr>
                <a href="HTMLInputImage.aspx">Назад</a> 
    			    nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;
                <a href="HTMLInputText.aspx">Вперед</a>
                <table bgcolor="#ffccff" border="0" width="100%">
                    <tr>
                        <th colspan="2" scope="col">
                            Результаты вычислений
                        </th>
                    </tr>
                    <tr>
                        <td>
                            <h2 id="colorText" >
                            </h2>
                        </td>
                        <td>
                            <h2 id="fruitText" >
                            </h2>
                        </td>
                    </tr>
                </table>
            </center>
        </form>
    </body>
    </html>
  • Выделите весь текст через меню Edit/Select All и скопируйте его через буфер в aspx-страницу ниже директивы @Page
  • В режиме Design оболочки выделите все радиокнопки и кнопку Submit, удерживая клавишу Shift на клавиатуре, и через контекстное меню на одном из выделенных элементов выполните команду Run As Server Control, чтобы добавить к этим элементам атрибут runat="server" и тем самым сделать их обрабатываемыми на сервере
  • Найдите в режиме Source теги colorText и fruitText и для каждого из них добавьте вручную атрибут runat="server", чтобы мы могли ими управлять через код C#
  • Найдите в режиме Source дескриптор <form> и добавьте для него вручную атрибут runat="server" (иначе не будет работать!!!)
  • Отметьте для себя, что управляемые на сервере элементы имеют в верхнем левом углу зелененькие маркеры в виде треугольничков (как на форме, так и в панели Document Outline).

  • Щелкните в кнопке Submit, чтобы создать обработчик в файле отделенного кода
  • Введите в обработчик кнопки следующий код
  • protected void SubmitButton_ServerClick(object sender, EventArgs e)
        {
            if (radio1.Checked)
                colorText.InnerText = "Выбран цвет \"Красный\"";
            else if (radio2.Checked)
                colorText.InnerText = "Выбран цвет \"Зеленый\"";
            else if (radio3.Checked)
                colorText.InnerText = "Выбран цвет \"Синий\"";
        
            if (radio4.Checked)
                fruitText.InnerText = "Выбран фрукт \"Бананы\"";
            else if (radio5.Checked)
                fruitText.InnerText = "Выбран фрукт \"Апельсины\"";
        }
  • Сделайте страницу HTMLInputRadioButton.aspx стартовой, постройте приложение и убедитесь, что все работает
  • Результат будет примерно таким

    Упражнение 11. Элемент управления HTMLInputText

    Элемент управления HTMLInputText позволяет программировать HTML-теги <input type="text> и <input type="password">. Эти теги позволяют пользователю вводить данные в текстовое поле, содержащееся в форме <form></form>. Программирование этих тегов позволяет динамически изменять атрибуты MaxLength, Size, Value.

    Поле пароля отличается от текстового поля тем, что когда пользователь вводит в него текст, вводимые символы скрываются и отображаются символом звездочка (*).

  • Добавьте к проекту новую страницу с отделенным кодом и именем HTMLInputText.aspx
  • В панели Toolbox откройте вкладку HTML и поместите на форму следующие компоненты:
  • Текстовое поле Input (Text) - 2 шт.
  • Текстовое поле Input (Password)
  • Кнопку Input (Submit)
  • Компонент Horizontal Rule
  • Компонент Table для позиционирования ссылок размером (1 строка x 3 столбца)
  • Из предыдущей страницы скопируйте ссылки и добавьте их в HTML-код текущей страницы между закрывающим дескрипторами </form> и </body>. Подправьте ссылки так
  • <a href="HTMLInputRadioButton.aspx">Назад</a>
         <a href="HTMLSelect.aspx">Вперед</a>
  • Выделите по очереди двойным щелчком каждую ссылку и перенесите в ячейки таблицы для позиционирования на Web-форме
  • Переведите поля и кнопку в режим обработки на сервере, выполнив для них команду контекстного меню Run As Server Control
  • Установите в панели Properties свойство ReadOnly поля для вывода учетной записи в значение readonly
  • Окончательный вид Web-формы должен быть примерно таким

  • Задайте для серверных элементов свойства id такие, какие будут иметь соответствующие переменные в кодовом файле C#, например: user, password, result, submit
  • Щелкните дважды по кнопке Submit, чтобы создать обработчик
  • После таких действий код интерфейсного файла HTMLInputText.aspx.cs может быть примерно таким

    <%@ Page Language="C#" AutoEventWireup="true" 
        CodeFile="HTMLInputText.aspx.cs" Inherits="HTMLInputText" %>
        
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <div style="text-align:center">
                <h1>Элемент управления HTMLInputText</h1>
                Пользователь: nbsp;<input id="user" style="width: 200px" 
                                           type="text" runat="server" />
                <p>
                    nbsp; nbsp; nbsp; nbsp;nbsp; nbsp;
                    Пароль:nbsp;
                    <input id="password" style="width: 200px" 
                           type="password" runat="server" /></p>
                    <p>Учетная запись:nbsp;
                        <input id="result" style="width: 400px" 
                               type="text" readonly runat="server" /></p>
                        <p>Заполните поля и нажмите кнопку Submit</p>
                <p></p>
                <input id="submit" type="submit" value="Получить учетную запись" 
                       onserverclick="Submit1_ServerClick" runat="server" />
                <p></p>
                <hr />
                <br />
                <table width="30%" style="text-align:center">
                    <tr>
                        <td style="width: 30%"><a href="HTMLInputRadioButton.aspx">Назад</a>
                        </td>
                        <td>
                        </td>
                        <td style="width: 30%"><a href="HTMLSelect.aspx">Вперед</a>
                        </td>
                    </tr>
                </table>
            </div>
        </form>
    </body>
    </html>
  • Внесите в обработчик ассоциированного файла CodeBehind (файл HTMLInputText.aspx.cs) следующий код
  • protected void Submit1_ServerClick(object sender, EventArgs e)
        {
            if (user.Value == "")
            {
                result.Value = "Введите имя пользователя";
                return;
            }
            else if (password.Value == "")
            {
                result.Value = "Введите пароль";
                return;
            }
            else
                result.Value = "User=" + user.Value +
                    " " + "Password=" + password.Value;
        }
  • Сделайте страницу HTMLInputText.aspx стартовой и постройте проект. Убедитесь в исправной работе страницы
  • Упражнение 12. Элемент управления HTMLSelect

    Элемент управления HTMLSelect позволяет программировать HTML-тег выпадающего списка <select> и встроенные в него теги пунктов списка <option>. Добавим страничку к нашему проекту, где продемонстрируем этот элемент.

  • Добавьте к проекту активную страницу Web Form с отделенным кодом и именем HTMLSelect.aspx. Сделайте страницу стартовой для удобства отладки
  • Настройте редактор Web-формы на абсолютное позиционирование добавляемых элементов пользовательского интерфейса. Для этого переведите страницу в режим редактирования Design и выполните команду Layout/Position/Auto-position Options. В появившемся окне включите верхний флажок "Change positioning ..." и удостовертесь, чтобы выпадающий список имел значение "Absolutely positioned"
  • В панели Toolbox откройте вкладку HTML и перенесите на форму компоненты, которые нужно расположить в соответствии с рисунком
  • Контейнер Div с размещенным в нем текстом "Элемент управления HTMLSelect" заголовка страницы
  • Компонент Input (Text) текстового поля с идентификатором id=optionTag
  • Контейнер Div с размещенным в нем текстом "Новая опция:" для маркировки текстового поля optionTag
  • Контейнер Div с размещенным в нем текстом "Результат" и идентификатором id=message для программного управления
  • Контейнер Div с размещенным в нем текстом "Сообщения:" для маркировки контейнера message
  • Компонент Select с идентификатором id=selectTag для программного управления
  • Кнопку Input (Submit) с идентификатором id=AddOption для программного управления и Value="Добавить новую опцию"
  • Кнопку Input (Submit) с идентификатором id=GetSelected для программного управления и Value="Показать выбор"
  • Компонент Horizontal Rule
  • Скопируйте с предыдущей страницы таблицу с размещенными в ней ссылками для перехода и в панели свойств отредактируйте их так
  • <a href="HTMLInputText.aspx">Назад</a>
         <a href="HTMLTable.aspx">Вперед</a>
  • Разместите компоненты так, как показано на рисунке. Задайте для элементов управления, которые будут участвовать в программном управлении ( optionTag, selectTag, message, AddOption, GetSelected), атрибут runat="server" и проследите за появлением зеленых маркеров на элементах управления, превращенных в серверные
  • Создайте обработчики для кнопок AddOption, GetSelected и заполните их так
  • protected void Page_Load(object sender, EventArgs e)
        {
            selectTag.Items[0].Text = "Первая опция";
        }
        
        protected void AddOption_ServerClick(object sender, EventArgs e)
        {
            selectTag.Items.Add(optionTag.Value);
            int count = selectTag.Items.Count;
            message.InnerText = "В список добавлена " +
                count + " опция";
            selectTag.SelectedIndex = count - 1;// Сделать текущей
        }
        
        protected void GetSelected_ServerClick(object sender, EventArgs e)
        {
            message.InnerHtml = "Вы выбрали: ";
        
            for (int i = 0; i <= selectTag.Items.Count - 1; i++)
            {
                if (selectTag.Items[i].Selected)
                    message.InnerHtml += selectTag.Items[i].Text;
            }
        }
  • Постройте приложение и проверьте его работоспособность
  • Как можно убедиться в ассоциированном файле по всплывающей подсказке при позиционировании курсора на объекте selectTag, элемент управления Select поддерживается библиотечным классом System.Web.UI.HtmlControls.HtmlSelect. В нашем случае экземпляром этого класса является объект с идентификатором selectTag. В этом объекте свойство Items, представляющее собой ссылку на экземпляр класса System.Web.UI.WebControls.ListItemCollection, содержит элементы списка и члены для управления этими элементами. Некоторые из этих членов приведены в таблице

    Некоторые методы класса ListItemCollection свойства Items
    Метод Описание
    Add() Добавляет новый пункт в конец списка
    Clear() Очищает список
    Contains() Возвращает true, если список содержит заданный пункт
    Count Свойство возвращает число пунктов в вписке
    IndexOf() Возвращает индекс пункта с заданным содержимым
    Insert() Вставляет содержимое в указанную позицию списка
    Remove() Удаляет заданный пункт из списка
    RemoveAt() Удаляет пункты из заданного индексного диапазона

    Упражнение 13. Элемент управления HTMLTable (HTMLTableRow, HTMLTableCell)

    Эти классы управляют тегами, отображающими таблицу. Через эти классы можно динамически изменять свойства тегов <table> - таблица в целом, <tr> - строка таблицы, <th> - заголовочный столбец, <td> - простой столбец. Можно, также, добавлять и уничтожать строки и ячейки. Приведем пример, в котором будем программно управлять таблицей с помощью выпадающих списков.

  • Добавьте к проекту новую страницу типа Web Form с отделенным кодом и именем HTMLTable.aspx
  • Назначьте ее стартовой для удобства отладки
  • Используя компоненты вкладки HTML панели Toolbox, оформите интерфейсную часть страницы так, как показано на рисунке, где программируемые (серверные) элементы отмечены зеленым маркером. Списки Select и подписи для них поместите в локализующую таблицу размером 2x6 с невидимыми границами
  • Гиперссылки вместе с локализующей таблицей скопируйте из предыдущей страницы и откорректируйте так
  • <a href="HTMLSelect.aspx">Назад</a>
    	 <a href="HTMLTextArea.aspx">Вперед</a>

  • Через меню свойств назначьте таблице идентификатор table, спискам соответственно bgColor, border, cellPad, cellSpac, selectRow, rowColor, Execute
  • Войдите в Source -режим и вручную присвойте дескрипторам <tr> таблицы table атрибуты runat="server" и id=Tr1, id=Tr2, id=Tr3
  • Дерево интерфейсных элементов с присвоенными им идентификаторами хорошо просматривается в панели Document Outline

  • Создайте обработчик для кнопки Submit, по щелчку на которой информация о текущем состоянии элементов управления в броузере будет собрана отправлена на сервер, и заполните обрабатывающий файл HTMLTable.aspx.cs следующим кодом
  • using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
        
    public partial class HTMLTable : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // Динамическое заполнение списков 
            // выполнить только при первом запросе
            if (!this.IsPostBack)
            {
                // Заполнение списка bgColor
                bgColor.Items[0].Text = "None";
                bgColor.Items[0].Value = "";
                bgColor.Items.Add("White");
                bgColor.Items.Add("Red");
                bgColor.Items.Add("Green");
                bgColor.Items.Add("Blue");
                bgColor.Items.Add("Yellow");
        
                // Заполнение списка border
                border.Items[0].Text = "0";
                border.Items.Add("1");
                border.Items.Add("2");
                border.Items.Add("3");
                border.Items.Add("4");
                border.Items.Add("5");
                border.SelectedIndex = 1;// Сделать текущей
        
                // Заполнение списка cellPad
                cellPad.Items[0].Text = "0";
                cellPad.Items.Add("1");
                cellPad.Items.Add("2");
                cellPad.Items.Add("3");
                cellPad.Items.Add("4");
                cellPad.Items.Add("5");
        
                // Заполнение списка cellSpace
                cellSpac.Items[0].Text = "0";
                cellSpac.Items.Add("1");
                cellSpac.Items.Add("2");
                cellSpac.Items.Add("3");
                cellSpac.Items.Add("4");
                cellSpac.Items.Add("5");
        
                // Заполнение списка selectRow
                selectRow.Items[0].Text = "1";
                selectRow.Items.Add("2");
                selectRow.Items.Add("3");
        
                // Заполнение списка rowColor
                rowColor.Items[0].Text = "None";
                rowColor.Items[0].Value = "";
                rowColor.Items.Add("White");
                rowColor.Items.Add("Red");
                rowColor.Items.Add("Green");
                rowColor.Items.Add("Blue");
                rowColor.Items.Add("Yellow");
            }
        }
        
        protected void Execute_ServerClick(object sender, EventArgs e)
        {
            // Управление атрибутами всей таблицы
            table.BgColor = bgColor.Value;
            table.Border = Convert.ToInt32(border.Value);
            table.CellPadding = Convert.ToInt32(cellPad.Value);
            table.CellSpacing = Convert.ToInt32(cellSpac.Value);
        
            // Управление атрибутами отдельных строк
            if (selectRow.Value == "1")
                Tr1.BgColor = rowColor.Value;
            else if (selectRow.Value == "2")
                Tr2.BgColor = rowColor.Value;
            else if (selectRow.Value == "3")
                Tr3.BgColor = rowColor.Value;
        }
    }
  • Постройте приложение и убедитесь в его работоспособности. Результат внешне должен выглядеть примерно так
  • Обратите внимание, что изменение фонового цвета всей таблицы не может изменить фоновый цвет, определенный для конкретной строки. Этим демонстрируется важное правило HTML и CSS (каскадные таблицы стилей), что внутренний атрибут всегда отменяет значение одноименного внешнего атрибута (своя рубаха ближе к телу).

  • Исходный код интерфейсной части может быть таким (приводится из милости к любимым студентам)
  • <%@ Page Language="C#" AutoEventWireup="true" 
        CodeFile="HTMLTable.aspx.cs" Inherits="HTMLTable" %>
        
    <html>
    <head>
        <title>HTMLTable</title>
    </head>
    <body>
        <div align="center">
            <form id="form1" runat="server" method="post">
                <h1>
                    Программное управление свойствами таблицы</h1>
                <div>
                    Управляемая таблица
                </div>
                <table id="table" runat="server" border="1" width="550">
                    <tr id="Tr1" runat="server">
                        <td style="width: 77px">
                            Стих 1
                        </td>
                        <td>
                            Мы рубим ступени - ни шагу назад
                        </td>
                    </tr>
                    <tr id="Tr2" runat="server">
                        <td style="width: 77px">
                            Стих 2
                        </td>
                        <td>
                            И от напряжения колени дрожат
                        </td>
                    </tr>
                    <tr id="Tr3" runat="server">
                        <td style="width: 77px">
                            Стих 3
                        </td>
                        <td>
                            И сердце к вершине готово бежать из груди
                        </td>
                    </tr>
                </table>
                <br />
                <table border="0" width="100%">
                    <tr align="center">
                        <td style="width: 17%">
                            Background Color</td>
                        <td style="width: 17%">
                            Border</td>
                        <td style="width: 17%">
                            Cellpadding</td>
                        <td style="width: 17%">
                            Cellspacing</td>
                        <td style="width: 17%">
                            Select a Row</td>
                        <td style="width: 17%">
                            Row Color</td>
                    </tr>
                    <tr align="center">
                        <td>
                            <select id="bgColor" runat="server" style="width: 138px;">
                                <option selected=""></option>
                            </select></td>
                        <td>
                            <select id="border" runat="server" style="width: 74px;">
                                <option selected=""></option>
                            </select></td>
                        <td>
                            <select id="cellPad" runat="server" style="width: 90px;">
                                <option selected=""></option>
                            </select></td>
                        <td>
                            <select id="cellSpac" runat="server" style="width: 84px;">
                                <option selected=""></option>
                            </select></td>
                        <td>
                            <select id="selectRow" runat="server" style="width: 102px;">
                                <option selected=""></option>
                            </select></td>
                        <td>
                            <select id="rowColor" runat="server" style="width: 82px;">
                                <option selected=""></option>
                            </select></td>
                    </tr>
                </table>
                <br />
                <input id="Execute" runat="server" type="submit" 
                       value="Submit" onserverclick="Execute_ServerClick">
                <br />
                <br />
                <table id="Table2" border="0" cellpadding="1" cellspacing="1" width="160">
                    <tr>
                        <td align="right">
                            <a href="HTMLSelect.aspx">Назад</a></td>
                        <td style="width: 20px"></td>
                        <td>
                            <a href="HTMLTextArea.aspx">Вперед</a></td>
                    </tr>
                </table>
            </form>
        </div>
    </body>
    </html>

    Упражнение 14. Элемент управления HTMLTextArea

    Этот тип позволяет программировать HTML-тег <textarea>. Этот тег подобен текстовому полю, только является многострочным и позволяет управлять размерами в единицах строк и столбцов.

    Разработаем страничку, на которой клиент будем вводить текст в поле ввода, а затем мы на сервере будем этот текст копировать в элемент <textarea> и отображать клиенту (но элемент <textarea> можно использовать и для программирования ввода).

  • Добавьте к проекту новую страницу Web Form с совмещенным кодом и именем HTMLTextArea.aspx. Сделайте страницу стартовой
  • Из вкладки HTML панели Toolbox поместите на форму компоненты
  • Input (Text) (id=inText) - текстовое поле
  • Textarea (id=outText) - текстовая область
  • Input (Submit) (id=Execute, value=Отправить) - кнопка обратной отсылки
  • Horizontal Rule - горизонтальная линия
  • Div - контейнеры с размещенным текстом в нужном количестве для маркировки компонентов
  • Присвойте компонентам указанные значения id и преобразуйте их в серверные элементы управления (команда контекстного меню Run As Server Control)
  • Интерфейсная часть выполняемой страницы должна выглядеть примерно так
  • Код гиперссылки сделайте таким
  • <a href="HTMLTable.aspx">Назад</a>
  • Создайте обработчик кнопки Submit в блоке скриптов страницы и запрограммируйте его вместе с обработчиком начальной загрузки страницы так, чтобы общий код страницы стал примерно таким
  • <%@ Page Language="C#" %>
        
    <script runat="server">
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                inText.MaxLength = (int)Math.Pow(2, 16);
                outText.Cols = 30;
                outText.Rows = 5;
                outText.Value = "";
            }
        }
        
        protected void Execute_ServerClick(object sender, EventArgs e)
        {
            outText.Value += inText.Value;  // Добавляем
            inText.Value = string.Empty;    // Очищаем
        }
    </script>
        
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <div align="center">
                <h1>
                    Программирование элемента HTMLTextArea</h1>
                <div>
                    Поле ввода текста:nbsp;
                    <input id="inText" style="width: 415px" type="text" runat="server" />
                    <br />
                </div>
                <div>
                    Поле вывода Textarea: nbsp;
                    <textarea id="outText" rows="2" cols="20" runat="server" />
                    <br />
                    <br />
                    <input id="Execute" type="submit" value="Отправить" runat="server"
                           onserverclick="Execute_ServerClick" />
                    <br />
                    <br />
                    <hr />
                </div>
                <a href="HTMLTable.aspx">Назад</a>
            </div>
        </form>
    </body>
    </html>
  • Постройте страничку и убедитесь в ее работоспособности
  • Сделайте стартовой первую страничку приложения (файл HTMLAnchor.aspx) и проверьте работоспособность всей цепочки построенных страничек
  • Вернуться к учебному плану