Создание динамического пользовательского интерфейса ASP.NET, управляемого данными - Создание пользовательского интерфейса управления специализированными клиентскими атрибутами и загрузка их текущих значений из базы данных
ОГЛАВЛЕНИЕ
Создание пользовательского интерфейса управления специализированными клиентскими атрибутами и загрузка их текущих значений из базы данных
В случае программного добавления веб-элементов к ASP.NET-странице необходимо удостовериться в том, что элементы добавляются на страницу при каждом посещении страницы - как при первом вызове, так и во всех последующих постбэках. В примере данный пользовательский интерфейс создается в событии Init. Обработчик события Page_Init получает все специализированные клиентские атрибуты из таблицы DynamicAttributesForClients для пользователя, который на данный момент авторизирован, и объединяет результат при помощи LEFT JOIN с таблицей DynamicValuesForClients, которая возвращает значения (если они есть) для специализированных клиентских атрибутов того клиента, чье значение ClientId было передано через строку запроса.
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
'Создание пользовательского интерфейса специализированных атрибутов
Using myConnection As New SqlConnection
myConnection.ConnectionString = ConfigurationManager.ConnectionStrings("LawFirmConnectionString").ConnectionString
Dim myCommand As New SqlCommand
myCommand.Connection = myConnection
myCommand.CommandText = "SELECT a.DynamicAttributeId, a.DataTypeId, a.AttributeName, v.DynamicValue " & _
"FROM DynamicAttributesForClients a " & _
"LEFT JOIN DynamicValuesForClients v ON a.DynamicAttributeId = v.AttributeId AND v.ClientId = @ClientId " & _
"WHERE a.CustomerId = @CustomerId " & _
"ORDER BY a.SortOrder"
myCommand.Parameters.AddWithValue("@ClientId", Request.QueryString("ID"))
myCommand.Parameters.AddWithValue("@CustomerId", Helpers.GetCustomerIdForLoggedOnUser())
myConnection.Open()
Dim myReader As SqlDataReader = myCommand.ExecuteReader
While myReader.Read()
Dim DynamicAttributeId As Guid = CType(myReader("DynamicAttributeId"), Guid)
Dim DataTypeId As DataTypeIdEnum = CType(Convert.ToInt32(myReader("DataTypeId")), DataTypeIdEnum)
Dim AttributeName As String = myReader("AttributeName").ToString()
Dim AttributeValue As Object = myReader("DynamicValue")
AddCustomAttribute(DynamicAttributeId, DataTypeId, AttributeName, AttributeValue)
End While
myReader.Close()
myConnection.Close()
End Using
End Sub
После этого специализированные атрибуты (и значения соответствующего клиента) и результаты перечисляются, а также создается соответствующий набор элементов управления. Страница ~/Customers/ClientCustomAttributes.aspx включает в себя элемент управления Table, названный CustomUITable. Данный элемент обладает строкой, программно добавленной для каждого специализированного клиентского атрибута. Каждая строка включает в себя две колонки, содержащие:
- Значение AttributeName (то есть, текст "Date of Injury").
- Пользовательский интерфейс, связанный с типом данных атрибута.
Метод AddCustomAttribute добавляет строку с двумя колонками к таблице CustomUITable для каждого специализированного клиентского атрибута.
Private Sub AddCustomAttribute(ByVal DynamicAttributeId As Guid, ByVal DataTypeId As DataTypeIdEnum, ByVal AttributeName As String, ByVal AttributeValue As Object)
'Добавление строки к CustomUITable
Dim tr As New TableRow
'Добавления названия в качестве левой ячейки
Dim tdName As New TableCell
tdName.Text = AttributeName
tdName.VerticalAlign = VerticalAlign.Top
tr.Cells.Add(tdName)
'Добавление пользовательского интерфейса в качестве правой ячейки
Dim UIControls As List(Of Control) = CreateCustomAttributeUI(DynamicAttributeId, DataTypeId, AttributeValue)
Dim tdUI As New TableCell
tdUI.VerticalAlign = VerticalAlign.Top
For Each ctrl As Control In UIControls
tdUI.Controls.Add(ctrl)
Next
tr.Cells.Add(tdUI)
CustomUITable.Rows.Add(tr)
End Sub
Метод CreateCustomAttributeUI генерирует веб-элементы управления для пользовательского интерфейса для текущего специализированного клиентского атрибута. Данный метод возвращает список (List) экземпляров Control (каждый элемент управления в ASP.NET унаследован от класса Control) соответствующего пользовательского интерфейса для каждого специализированного клиентского атрибута.
Вспомните то, что каждому атрибуту назначается тип данных, который диктует тип информации, требуемой от клиента. Мы определили четыре типа данных в первой части данной серии статей . Следующий список перечисляет данные типы данных и указывает пользовательский интерфейс, который демо-приложение использует для каждого:
- String - элемент управления TextBox со множеством строк.
- Boolean - элемент управления CheckBox .
- Numeric - элемент управления TextBox и CompareValidator, который обеспечивает то, что пользователь введет правильное числовое значение.
- Date - элемент управления TextBox и CompareValidator, который обеспечивает то, что пользователь введет правильное значение даты .