| Украина, Киев |
Пользовательские элементы управления
Упражнение 3. Применение вспомогательных классов при создании сложных пользовательских элементов управления
Иногда приходится создавать специальные классы для организации взаимодействия между пользовательским элементом управления и Web-страницей. Создадим сложный пользовательский элемент управления LinkTable, предназначенный для генерирования набора гиперссылок в форматированной таблице. Для удобства часть кода разместим в отдельном самостоятельном классе LinkTableItem.
-
Создайте
страницу Web Form с раздельным кодом и именем LinkTableTest.aspx
-
Сделайте
эту страницу стартовой -
Добавьте
к проекту новую папку с зарезервированным именем App_Code.
Для этого в панели Solution Explorer вызовите контекстное
меню для корневого узла Web-дерева и выполните команду Add ASP.NET Folder/App_Code
-
Через
контекстное меню на созданной папке App_Code выполните
команду Add
New Item и добавьте к приложению новый класс C#
с именем LinkTableItem.cs
Этот класс в своих полях будет хранить информацию, необходимую пользовательскому элементу управления, а через свойства осуществлять доступ к ней.
-
Заполните
вспомогательный класс в файле LinkTableItem.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;
/// <summary>
/// Вспомогательный класс LinkTableItem
/// </summary>
public class LinkTableItem
{
// Хранимые поля закрытого типа
private string text, url;
// Конструктор по умолчанию
public LinkTableItem()
{
// Пустой конструктор по умолчанию обязателен
// поскольку есть общий конструктор
}
// Общий конструктор
public LinkTableItem(string text, string url)
{
// Внутренним полям присваиваются значения,
// переданные из родительского объекта
this.text = text;
this.url = url;
}
// Определение свойств доступа к внутренним полям
public string Text
{
get { return text; }
set { text = value; }
}
public string Url
{
get { return url; }
set { url = value; }
}
}
Листинг
32.11.
Код файла App_Code/LinkTableItem.cs
Теперь нужно создать пользовательский элемент, который будет управлять этим вспомогательным классом.
-
Создайте
заготовку пользовательского элемента управления с
отделенным кодом и именем LinkTable.
Для этого выполните команду Add New Item,
вызвав контекстное меню для корневого узла проекта в панели Solution
Explorer и установив шаблон Web User Control
-
Поместите
в таблицу пользовательского элемента следующие стандартные
компоненты:- Table из вкладки HTML, который будет форматировать размещение стандартных элементов управления
- Label из вкладки Standard в верхнюю ячейку таблицы, который будет определять заголовок набора ссылок
- Image из вкладки HTML, определяющий рисунок маркера ссылок
- DataList из вкладки Data в нижнюю ячейку таблицы
- HyperLink из вкладки Standard
-
Настройте
интерфейсную часть пользовательского элемента управления
так
<%@ Control Language="C#" AutoEventWireup="true"
CodeFile="LinkTable.ascx.cs" Inherits="LinkTable" %>
<table cellpadding="2">
<tr>
<td>
<asp:Label ID="lblTitle" runat="server" Font-Bold="true"
Font-Names="Vernada" Font-Size="Small"
ForeColor="#C00000">
<%--Здесь будет заголовок--%>
</asp:Label>
</td>
</tr>
<tr>
<td>
<asp:DataList ID="listContent" runat="server">
<ItemTemplate>
<img alt="маркер" height="13" src="32_27.gif" width="25">
<asp:HyperLink ID="HyperLink1" runat="server"
NavigateUrl='<%# DataBinder.Eval(Container.DataItem, "Url") %>'
Text='<%# DataBinder.Eval(Container.DataItem, "Text") %>'>
</asp:HyperLink>
</ItemTemplate>
</asp:DataList>
</td>
</tr>
</table>
Листинг
32.12.
Код интерфейсной части в файле LinkTable.ascx
Дескриптор <img> для красоты определяет
маркер, который вы можете сами изготовить размером 25x13 или
взять из прилагаемого каталога Source (файл 32_27.gif,
который имеет изображение
).
Атрибут alt задает альтернативную надпись
в поле рисунка, если последний не будет найден.
-
Вызовите
для корневого узла проекта контекстное меню и командой Add Existing Item скопируйте
из прилагаемого каталога Source файл 32_27.gif
Теперь пришла пора программно расширить функциональность пользовательского элемента управления LinkTable.
-
Вызовите
на редактирование файл LinkTable.ascx.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 LinkTable : System.Web.UI.UserControl
{
public string Title
{
get { return lblTitle.Text; }
set { lblTitle.Text = value; }
}
private LinkTableItem[] items;
public LinkTableItem[] Items
{
get { return items; }
set
{
items = value;
// Обновляем сетку
listContent.DataSource = items;
listContent.DataBind();
}
}
}
Листинг
32.13.
Код фала LinkTable.ascx.cs пользовательского элемента управления
Разработка пользовательского элемента управления закончена. Теперь нужно поместить его на пользовательскую тестовую страницу LinkTableTest.aspx, которую мы создали в самом начале выполнения этого упражнения и сделали ее стартовой.
-
Выполните
команду Window/Close All Documents, чтобы закрыть все окна
редактирования -
Откройте
через панель Solution Explorer на редактирование
файл LinkTableTest.aspx в
режиме Design и перетащите на форму из этой
панели узел LinkTable.ascx пользовательского
элемента управления
Дескрипторное представление тестовой страницы с зарегистрированным на ней пользовательским элементом управления имеет такой вид
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="LinkTableTest.aspx.cs" Inherits="LinkTableTest" %>
<%@ Register Src="LinkTable.ascx" TagName="LinkTable" TagPrefix="uc1" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Тестовая страница сложного элемента управления</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<uc1:LinkTable ID="LinkTable1" runat="server" />
</div>
</form>
</body>
</html>
Листинг
32.14.
Дескрипторное представление тестовой страницы LinkTableTest.aspx
-
Откройте
на редактирование застраничный файл LinkTableTest.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 LinkTableTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// Формируем заголовок списка
LinkTable1.Title = "Список жизненно важных гиперссылок";
// Создаем список элементов - гиперссылок
LinkTableItem[] items = new LinkTableItem[3];
items[0] = new LinkTableItem("Ссылка №1 к Большому Биллу",
"http://www.microsoft.com");
items[1] = new LinkTableItem("Ссылка №2 к автошколе \"Диалог-Сервис\"",
"http://www.dialog-service.net");
items[2] = new LinkTableItem("Ссылка №3 к затычке JavaScript",
"javascript:void(0)");
LinkTable1.Items = items;
}
}
Листинг
32.15.
Файл LinkTableTest.aspx.cs поддержки тестовой страницы
-
Запустите
приложение и убедитесь, что генерируемый пользовательским
элементом управления набор гиперссылок работает исправно


