Разработка пользовательских серверных веб-элементов управления с привязкой к данным для ASP.NET 1.1
Обновлен: Ноябрь 2007
Серверный веб-элемент управления с привязкой к данным ASP.NET предоставляет пользовательский интерфейс для источника данных, представляющего набор записей или элементов. Серверные элементы управления Общие сведения о серверном веб-элементе управления GridView, Общие сведения о серверном веб-элементе управления DataList и Общие сведения о серверном веб-элементе управления Repeater являются примерами веб-серверных управления с привязкой к данным. Дополнительные сведения о серверных веб-элементах управления с привязкой к данным в составе ASP.NET см. в разделе Общие сведения о серверных веб-элементах управления ASP.NET с привязкой к данным.
В данном разделе описаны шаги, необходимые для реализации минимальной совместимости серверного веб-элемента управления с ASP.NET версии 1.1. Дополнительные сведения о создании пользовательских элементов управления с привязкой к данным для ASP.NET версии 2.0, см. в разделе Разработка пользовательских серверных веб-элементов управления с привязкой к данным для ASP.NET 2.0. Дополнительные сведения об общей архитектуре и реализации пользовательских элементов управления см. в разделах Разработка пользовательских серверных элементов управления ASP.NET и Пошаговое руководство. Создание и использование пользовательского серверного элемента управления.
Причины создания пользовательского элемента управления с привязкой к данным
Перед созданием собственного пользовательского элемента управления с привязкой к данным изучите возможности существующих элементов управления с привязкой к данным, представленных в ASP.NET. Может оказаться так, что существующие элементы управления полностью удовлетворяют требованиям разработчика или можно ограничиться созданием пользовательского элемента управления, который расширяет существующий элемент управления, который предоставляет большинство требуемых возможностей. Дополнительные сведения о серверных веб-элементах управления с привязкой к данным в составе ASP.NET см. в разделе Общие сведения о серверных веб-элементах управления ASP.NET с привязкой к данным.
Причины, по которым требуется создать пользовательский элемент управления с привязкой к данным:
Требуется особый пользовательский интерфейс, нестандартные функции сортировки данных или нестандартные функции редактирования данных, которые не доступны в существующих элементах управления с привязкой к данным.
Требуется создать пользовательский элемент управления с привязкой к данным, который предварительно компилируется и распространяется отдельно от программы.
Требуется расширить возможности существующего в ASP.NET элемента управления с привязкой к данным.
Требуется создать элемент управления с привязкой к данным со специализированным конструктором, который соответствует заданным требованиям.
Основные функциональные возможности пользовательского элемента управления с привязкой к данным
При наследовании от класса Control или от класса WebControl, пользовательский элемент управления с привязкой к данным автоматически наследует множество встроенных возможностей, в том числе следующие:
Модель явной привязки к данным, которая поддерживает выражения привязки к данным. Модель ASP.NET явной привязки к данным выполняет связывание данных только при необходимости, а не при каждой обратной передаче. После того, как страница выполняет первый запрос привязки данных, последующие запросы попытаются извлечь данные из состояния просмотра. Это позволяет повысить производительность, исключая необходимость переподключения к источнику данных при каждом запросе.
Поддержка выражений привязки данных, которые позволяют разработчикам создавать привязки между доступом, и специально отмечать свойства элемента управления и источника данных. Дополнительные сведения о выражениях привязки данных см. в разделе Общие сведения о выражениях для привязки данных.
Использование доступных функций времени разработки
Функции времени разработки доступны всем серверным веб-элементам управления, которые, возможно, понадобятся для элемента управления привязки к данным. Можно создать конструктор класса и шаблоны элементов управления для пользовательского элемента управления. Данные функции вызываются при работе с элементом управления в оболочках визуального конструктора, например, в представлении конструирования в Visual Studio.
Создание конструктора элемента управления может значительно повысить удобство работы с пользовательским элементом управления во время разработки, предоставляя интерфейс разработчика, который позволяет настраивать свойства элемента управления. Общие сведения о конструкторах элемента управления ASP.NET см. в разделе Общие сведения о конструкторах элементов управления ASP.NET. Примеры см. в разделах HierarchicalDataBoundControlDesigner и Пошаговое руководство. Создание базового конструктора элементов управления для серверного веб-элемента управления.
Создание элемента управления-шаблона предоставляет разработчикам страниц дополнительную гибкость при выполнении указания элементов управления и разметки, которые определяют пользовательский интерфейс элемента управления. Пример шаблона пользовательского элемента управления-шаблона см. в разделе Пример шаблонного серверного элемента управления.
Реализация пользовательского элемента управления привязки к данным в ASP.NET
В следующей таблице перечислены требования, относящиеся к реализации серверного элемента управления с привязкой к данным в ASP.NET 1.1. Более подробные сведения о требованиях каждой реализации приведены после таблицы.
Требование |
Описание |
---|---|
Предоставление свойства DataSource. |
Позволяет разработчику страницы использовать созданный элемент управления для указания источника данных для привязки. |
Переопределение метода DataBind и создание логики для перечисления объекта в соответствующем источнике данных. |
В данной логике метода:
|
Создание иерархии дочерних элементов управления путем переопределения метода CreateChildControls. |
При обратной передаче повторно создаются дочерние элементы управления и привязываются к данным, хранящимся в состоянии просмотра во время предыдущего вызова DataBind. |
Примечание. |
---|
Рассмотрите возможность создания одного вспомогательного метода, который будет инициирован методами DataBind и CreateChildControls для создания иерархии дочерних элементов управления. Например, вспомогательный метод, который создает иерархию дочерних элементов управления, может принимать значение типа Boolean, которое указывает, что данные получены из присоединенного источника, либо из состояния представления. Шаблон хранит создание иерархии элементов управления дочерних элементов управления на одной общей ветви кода. Пример такого шаблона см. в разделе Пошаговое руководство. Создание пользовательского веб-элемента привязки данных ASP.NET для ASP.NET 1.1. |
Предоставление свойства DataSource
Элемент управления ASP.NET 1.1 с привязкой к данным, производный от класса Control или WebControl, должен предоставлять свойство DataSource, чтобы включить разработчик страницы, позволяющий выбрать коллекцию данных, к которому будет привязываться серверный элемент управления. Во время выполнения пользовательский элемент управления с привязкой к данным перечисляет через коллекции данных, присвоенные свойству DataSource, способы создания и привязки элементов пользовательского интерфейса для представления данных.
Серверный элемент управления с привязкой к данным можно привязать к следующим типам:
Объекту, реализующему интерфейс IEnumerable, (например, объекту Array, ArrayList, или Hashtable).
Объекту, реализующему интерфейс IListSource (например, объекту DataSet).
В следующем примере кода показано, как предоставить свойство DataSource для элементов управления с привязкой к данным. Тип DataSource объявлен как тип IEnumerable.
<Category("Data"), DefaultValue(""), Description("An exposed data source: A public member of type IEnumerable to bind to such as an Array, ArrayList or Hashtable.")> _
Public Overridable Property DataSource() As IEnumerable
Get
Return _dataSource
End Get
Set(ByVal value As IEnumerable)
If TypeOf value Is IEnumerable OrElse value Is Nothing Then
_dataSource = value
Else
Throw New ArgumentException()
End If
End Set
End Property
[
Category("Data"),
DefaultValue(""),
Description("An exposed data source: A public member of type IEnumerable to bind to such as an Array, ArrayList or Hashtable.")
]
public virtual IEnumerable DataSource
{
get
{
return _dataSource;
}
set
{
if ((value is IEnumerable) || (value == null))
{
_dataSource = value;
}
else
{
throw new ArgumentException();
}
}
}
Данный пример начинается с атрибутов метаданных, например, [Category], [DefaultValue] и [Description], которые предоставляют сведения, используемые средствами разработки, анализатором страниц ASP.NET, средой выполнения ASP.NET и средой CLR. BindableAttribute уведомляет визуальный конструктор, что обозреватель свойств может отображать свойства связывания элементов управления в диалоговом окне. Например, в Visual Studio, свойства связывания отображаются в диалоговом окне Привязка данных. CategoryAttribute указывает, как классифицировать свойства в обозревателе свойств визуального конструктора элементов. Дополнительные сведения об атрибутах метаданных, включая используемые в данном примере, см. в разделе Атрибуты метаданных для специализированных серверных элементов управления.
Метод доступа «set» для свойства DataSource проверяет, является ли задаваемое значение типом null, либо типом IEnumerable. Поэтому в данном примере разработчик страницы может привязать данные к любому типу IEnumerable, например, Array, ArrayList или Hashtable. Кроме того, разработчик может задавать для свойства DataSource значение null до тех пор, пока не станет доступен подходящий источник данных типа IEnumerable.
Примечание. |
---|
Если требуется, чтобы пользовательский элемент управления с привязкой к данным имел возможность привязаться к типу данных IEnumerable или IListSource, можно объявить свойство DataSource в качестве базового типа Object. В данном случае метод доступа set, предоставляющий свойство DataSource, должен проверить тип переданного объекта, и затем реализовать либо объект IEnumerable, либо объект IListSource. |
Переопределение метода DataBind и перечисление данных, связанных с источником
Базовый метод DataBind в пользовательском элементе управления необходимо переопределить для предварительного решения двух задач: перечисления коллекции связанных данных и создания иерархии дочерних элементов управления, представляющих данные. В следующем списке перечислены задачи, которые необходимо выполнить в переопределенном методе DataBind:
Вызовите базовый метод OnDataBinding пользовательского элемента управления.
Удалите все существующие дочерние элементы управления.
Удалите все состояния представления дочернего элемента.
Отследите состояние таким образом, чтобы изменения во время связывания данных сохранились в состоянии представления.
Создайте иерархию дочерних элементов управления.
Установите для свойства ChildControlsCreated значение true.
Начните с вызова базового метода OnDataBinding элемента управления из переопределенного метода DataBind в элементе управления. Вызов базового метода OnDataBinding элемента управления приводит к тому, что все выражения привязки данных для элемента управления будут вычислены. В следующем примере кода показано, как вызвать метод OnDataBinding в серверном элементе управления с привязкой к данным в качестве первой задачи в его переопределенном методе DataBind.
public override void DataBind()
{
base.OnDataBinding(EventArgs.Empty);
}
Public Overrides Sub DataBind()
MyBase.OnDataBinding(EventArgs.Empty)
End Sub
Затем, удалите существующие дочерние элементы управления. Поскольку иерархия дочерних элементов управления должна создаваться заново с каждым обратным запросом на основе связываемых данных, все существующие дочерние элементы управления должны быть сняты путем вызова наследуемого метода Clear элемента управления, как показано в следующем примере.
public override void DataBind()
{
base.OnDataBinding(EventArgs.Empty);
Controls.Clear();
}
Public Overrides Sub DataBind()
MyBase.OnDataBinding(EventArgs.Empty)
Controls.Clear()
End Sub
Новые дочерние элементы управления будут создаваться, чтобы представить вновь связанные данные, поэтому любое состояние отображения для существующих дочерних элементов управления должно быть удалено. Удалите состояния просмотра всех дочерних элементов управления путем вызова наследуемого метода ClearChildViewState элемента управления.
После удаления состояния просмотра для любых существующих дочерних элементов управления, запустите режим отслеживания состояния просмотра элемента управления путем вызова наследуемого метода TrackViewState элемента управления, который обеспечивает отслеживание состояния просмотра. Режим отслеживания состояния элемента управления запускается до создания иерархии дочерних элементов управления, чтобы любые изменения в иерархии дочерних элементов управления, сделанные во время связывания данных, сохранились в состоянии представления. Поскольку разработчик страницы может вызвать метод DataBind во время события PreInit страницы, нельзя полагаться на базовый класс элемента управления при отслеживании состояния после той стадии жизненного цикла страницы. В данном случае режим отслеживания состояния представления для элемента управления в процессе происходит слишком поздно.
Следующий пример кода иллюстрирует серверный элемент управления с привязкой к данным, вызванный его методом TrackViewState.
public override void DataBind()
{
TrackViewState();
}
Public Overrides Sub DataBind()
TrackViewState()
End Sub
Создайте иерархию дочерних элементов управления. Иерархия дочерних элементов управления визуально представляет собой источник данных, с которым связан пользовательский элемент управления с привязкой к данным. Иерархия создается при вызове базовым элементом управления переопределенного метода DataBind или CreateChildControls пользовательского элемента управления классом. При вызове переопределенного метода DataBind, вызванного базовым классом элемента управления, иерархия потомка элемента управления создается на основе привязанного источника данных. Если элемент управления переопределен методом CreateChildControls, вызванным базовым классом, иерархия дочернего элемента управления создается на основе данных, сохраненных в состоянии представления.
Создание дочерней иерархии элементов управления происходит путем вызова метода DataBind элемента управления. Элемент управления перечисляет данные, предоставляемые свойством предоставленного свойства DataSource, и создает новый дочерний элемент управления для представления каждого элемента данных. Например, если источником данных является массив строк, привязанный к свойству Text элемента управления Button, выполните итерацию массива, создав новый элемент управления Button со свойством Text, назначенным элементу повторных данных в виде строки.
После создания иерархии дочерних элементов управления, присвойте свойству ChildControlsCreated значение true, чтобы указать, что метод CreateChildControls не должен инициироваться базовым классом.
Следующий пример кода иллюстрирует установку свойства ChildControlsCreated серверного элемента управления с привязкой к данным в значение true.
public override void DataBind()
{
ChildControlsCreated = true;
}
Public Overrides Sub DataBind()
ChildControlsCreated = True
End Sub
Класс пользовательского элемента управления с привязкой данных должен предоставлять переопределенный метод CreateChildControls, в котором элемент управления повторно создает его дочернюю иерархию элементов управления и позволяет сохранить состояние отображения для применения. (Сохраненное состояние представления отслеживается при вызове метода DataBind элемента управления).
В следующем списке перечислены задачи, которые необходимо выполнить внутри переопределенного метода CreateChildControls:
Удалите все существующие дочерние элементы управления.
Создайте иерархию элементов управления, если состояние просмотра доступно.
До повторного создания иерархии дочерних элементов управления необходимо удалить все существующие дочерние объекты элементов управления. Это делается путем вызова метода Clear элемента управления.
Следующий пример кода иллюстрирует серверный элемент управления с привязкой к данным, вызванный его методом Clear.
public override void CreateChildControls()
{
Controls.Clear();
}
На последнем шаге создайте иерархию дочерних элементов управления. Метод CreateChildControls должен повторно создать иерархию дочерних элементов управления, если доступно состояние представления. Пока те же числа и типы дочерних элементов управления созданы в той же иерархии, сохраненное состояние представления автоматически применяется к дочерним элементам управления. Элемент управления может сохранить сведения, необходимые для воссоздания числа, типа и иерархии дочерних элементов управления в свойстве ViewState элемента управления. Дополнительные сведения о сохранении режима представления элемента управления см. в разделе ViewState. Полный пример кода, создающего иерархию дочерних элементов управления в пользовательском элементе управления со связыванием данных, см. в разделе Пошаговое руководство. Создание пользовательского веб-элемента привязки данных ASP.NET для ASP.NET 1.1.
Создание пользовательского серверного элемента управления
Дополнительные сведения о создании пользовательских веб-элементов управления с привязкой к данным и использовании их на веб-странице см. в разделе Примеры связывания пользовательского серверного элемента управления.
Примечание. |
---|
Необходимо добавить ссылку на сборку System.Design, чтобы включить его в компиляцию. |
См. также
Задачи
Пошаговое руководство. Создание и использование пользовательского серверного элемента управления
Основные понятия
Общие сведения о серверных веб-элементах управления ASP.NET с привязкой к данным
Атрибуты метаданных для специализированных серверных элементов управления
Общие сведения о конструкторах элементов управления ASP.NET
Ссылки
HierarchicalDataBoundControlDesigner
Другие ресурсы
Разработка пользовательских серверных элементов управления ASP.NET