• Microsoft .NET
  • ASP.NET
  • Создание динамического пользовательского интерфейса ASP.NET, управляемого данными

Создание динамического пользовательского интерфейса 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, который обеспечивает то, что пользователь введет правильное значение даты .
Код генерации пользовательского интерфейса для каждого типа данных жестко запрограммирован в методе CreateCustomAttributeUI. Альтернативным подходом будет моделирование типов данных в качестве классов в веб-приложении, которые будут ответственны за обработку своих же пользовательских интерфейсов. Это будет идеальным подходом, но легче было бы увидеть и понять то, что происходит с жестко запрограммированным созданием пользовательского интерфейса в фоновом коде - вот поэтому я и выбрал данный подход. В дополнение к созданию пользовательского интерфейса, метод CreateCustomAttributeUI также назначает текущее значение из базы данных элементу управления. К примеру, если существует специализированый клиентский атрибут, названный "Date of Injury", и редактируемый клиент имеет значение 4/1/2008 для данного атрибута, то метод CreateCustomAttributeUI создает элементы управления TextBox и CompareValidator, связанные с данным пользовательским интерфейсом и назначает свойство Text элемента TextBox в "4/1/2008".