Книга: Обработка баз данных на Visual Basic®.NET

Объект DataView

Объект DataView позволяет одновременно создавать разные представления данных из объекта DataTable и обладает перечисленными ниже свойствами, которые позволяют настраивать способ отображения данных.

Порядок сортировки (нисходящий или восходящий) по одному или нескольким полям.

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

Фильтр состояния записи, который указывает критерии отображения записей на основе состояния записи (см. перечисление DataViewRowState, показанное в табл. 5.3).

Хотя этот способ может показаться аналогичным способу на основе использования метода Select объекта DataTable, они существенно отличаются. С одной стороны, объект DataView – это полностью динамичное представление данных. Помимо изменений значений полей, вставки и удаления записей в таблице-источнике немедленно отражаются в объекте DataView. С другой стороны, метод Select возвращает массив фиксированный длины со ссылками на записи, которые отражают изменения значений полей в таблице-источнике, но не отражают вставку и удаление записей или их упорядочение. Этот динамический аспект объекта DataView особенно эффективно применяется для создания кода, связанного с данными. 

НА ЗАМЕТКУ

Хотя объект DataView аналогичен классическому представлению базы данных, он все же отличается от него следующим:

• не может использоваться как таблица;

• не может быть объединением нескольких таблиц;

• не может исключать поля, которые присутствуют в таблице-источнике;

• не может включать дополнительные поля (например, вычисленные поля), которых нет в таблице-источнике.

Объекты DataView используются с помощью свойства DefaultView объекта DataTable. Предположим, нужно создать представление для таблицы Customers, причем клиенты в нем должны быть упорядочены по почтовым индексам и иметь фамилии, начинающиеся с символа С. Для этого нужно использовать указанные ниже значения двух соответствующих свойств.

dsCustomers.Tables("Customers").DefaultView.RowFilter = _
 "LastName = 'Like C* ' "
dsCustomers.Tables("Customers").DefaultView.Sort = "Zip"

Если необходимо отобразить в представлении текущие значения только из тех записей, которые были изменены (но еще не сохранены), то нужно указать новое значение для свойства RowFilter и значение свойства RowState.

dsCustomers.Tables("Customers").DefaultView.RowFilter = " "
dsCustomers.Tables("Customers").DefaultView.RowStateFilter = _
 DefaultView.RowState.ModifiedCurrent

НА ЗАМЕТКУ

Объект DataView также имеет метод Find для поиска одной записи и метод FindRows для поиска и возвращения нескольких записей. Если нужно извлечь или набор записей, которые соответствуют заданному критерию, вместо динамического представления данных, то с помощью методов Find и FindRows (вместо указания свойства RowFilter) будут возвращены только интересующие нас записи. Этот метод обладает более высокой производительностью, чем метод на основе установки значения свойства RowFilter. Дело в том, что указание значения свойства RowFilter вызывает перестройку индекса представления, а методы Find и FindRows используют уже существующие индексы.

Для таблицы могут быть созданы также дополнительные объекты – представления данных. Для определения еще одного представления таблицы Customers нужно создать еще один объект dvView2 и указать его свойства так, как показано ниже.

dvView2 = New DataView(dsCustomers.Tables("Customers"), _
 "", "LastName", DataViewRowState.CurrentRows)

Теперь, после определения объекта DataView, можно изменить его свойства.

dvView2.RowFilter = "LastName > 'F'"
dvView2.Sort = "LastName DESC"
dvView2.RowStateFilter = DataViewRowState.Current
 

НА ЗАМЕТКУ

Объект DataViewManager предлагает удобный централизованный способ управления параметрами представлений для всех таблиц набора данных DataSet.

В большинстве других случаев объект DataView аналогичен объекту DataTable. Доступ к отдельным записям и полям представления осуществляется с помощью объекта DataRowView. Этот объект также поддерживает отношения между таблицами объекта DataSet.

Объект DataView имеет модель редактирования, аналогичную модели редактирования объекта DataTable. Указание значения True для свойств AllowNew, AllowEdit и  AllowDelete означает разрешение на выполнение соответствующих операций редактирования (вставки, изменения и удаления). Методы BeginEdit и EndEdit и CancelEdit объекта DataRowView управляют внесением изменений в объект DataTable. Метод EndEdit вносит изменения в объект DataRow с версией Current. Эти изменения затем принимаются (или отвергаются) базовым объектом DataTable с помощью метода AcceptChanges (или RejectChanges).

Рассмотрим теперь, как описанные выше идеи применяются на практике. Создайте новую форму frmDataViews в проекте DataSetCode (готовая версия этой формы находится в каталоге с примерами главы 5, "ADO.NET: объект DataSet") для создания двух разных представлений одной таблицы Customers. Каждый объект DataGrid отображает данные представления и содержит кнопки управления сортировкой и фильтрацией. Для этого выполните перечисленные ниже действия.

1. В форме frmDataSets проекта DataSetCode создайте новую кнопку под кнопкой Data Adapter Updates.

2. В окне Properties укажите значение btnDataViews для свойства (Name) и значение Data Views для свойства Text этой кнопки.

3. Создайте новую форму.

4. В окне Properties укажите значение frmDataViews для свойства (Name) и значение Dueling Data Views для свойства Text новой формы Form1.

5. Увеличьте размер формы frmDataViews.

6. Создайте в правой части формы сетку данных DataGrid1, текстовое поле txtFilter1 с надписью, поле со списком cboSort1 и надписью, флажок chkDesc1 с надписью, поле со списком cboRowState1 и надписью, кнопку btnApply1, перетаскивая их из панели элементов управления.

7. В окне Properties укажите значение Descending для свойства Text флажка chkDesc1 и значение Apply для свойства Text кнопки btnApply1. Укажите значение DropDownList для свойства DropDownStyle полей со списком cboSort1 и cboRowState1. Укажите для свойства Text надписей значения by Column: и Row State.

8. Укажите значение Default Data View для свойства CaptionText сетки DataGrid1.

9. Расположите элементы управления так, как показано на рис. 7.2. 


РИС. 7.2. Расположение элементов управления в верхней части формы frmDataViews


РИС. 7.З. Окончательный вид формы frmDataViews

10. Выберите все элементы управления и скопируйте их в нижнюю часть формы frmDataViews. Переименуйте все элементы управления (за исключением надписей) так, чтобы их имена заканчивались цифрой 2, а не 1 (например, btnApply2).

11. Укажите значение DataView2 для свойства CaptionText сетки DataGrid2.

Окончательный вид формы frmDataViews показан на рис. 7.3, а ее код представлен в листинге 7.6.

Листинг 7.6. Код создания двух объектов-сеток для отображения разных представлений одной таблицы данных

Imports System
Imports System.Data
Imports System.Data.SqlClient
Public Class frmDataViews
 Inherits System.Windows.Forms.Form
"Windows Form Designer generated code"
 Private dsCustomers As New DataSet()
 Private dvView2 As DataView
 Private Sub frmDataViewS_Load(ByVal sender As System.Object, _
  ByVal e As System.EventArgs) Handles MyBase.Load
  Dim i As Integer
  Dim col As DataColumn
  ' Инициализация объекта DataAdapter.
  Dim daCustomers As SqlDataAdapter = New _
   SqlDataAdapter("select * from tblCustomer", _
   "server=localhost;uid=sa;database=novelty")
   ' Вставка данных только в ОДНУ таблицу.
  daCustomers.Fill(dsCustomers, "Customers")
  ' Создание второго объекта DataView.
  dvView2 = New DataView(dsCustomers.Tables("Customer"), _
   "", "LastName", DataViewRowState.CurrentRows)
  ' Вставка списка из имен полей.
  For Each col In dsCustomers.Tables("Customers.Columns")
   cboSort1.Items.Add(col.ColumnName)
   cboSort2.Items.Add(col.ColumnName)
  Next
  ' Вставка объекта DataViewRowState.
  Dim names As String()
  names = DataViewRowState.None.GetNames(DataViewRowState.None.GetType)
  For i = 0 To names.GetUpperBound(0)
   cboRowState1.Items.Add(names(i))
   cboRowState2.Items.Add(names(i))
  Next
  ' Указание значений по умолчанию.
  txtFilter1.Text = ""
  txtFilter2.Text = ""
  cboSort1.SelectedItem = "ID"
  cboSort2.SelectedItem = "ID"
  chkDesc1.Checked = False
  chkDesc2.Checked = False
  cboRowState1.SelectedItem = "CurrentRows"
  cboRowState2.SelectedItem = "CurrentRows"
  dsCustomers.Tables("Customers").DefaultView.Sort = "ID"
  dvView2.Sort = "ID"
  ' Связывание сеток данных с таблицей.
  DataGrid1.DataSource = dsCustomers.Tables("Customers").DefaultView
  DataGrid2.DataSource = dvView2
 End Sub
 Private Sub btnApply1_Click(ByVal sender As System.Object, _
  ByVal e As System.EventArgs) Handles btnApply1.Click
  Dim sort As String
  Dim rowState As DataViewRowState
  ' Указание фильтра.
  dsCustomers.Tables("Customers").DefaultView.RowFilter = _
   txtFilter1.Text
  ' Указание сортировки.
  sort = cboSort1.SelectedItem
  If chkDesc1.Checked Then
   sort = sort & " DESC"
  End If
  dsCustomers.Tables("Customers").DefaultView.Sort = sort
  ' Указание состояния записи.
  dsCustomers.Tables("Customers").DefaultView.RowStateFilter = _
   rowState.Parse(rowState.GetType, cboRowState1.SelectedItem)
 End Sub
 Private Sub btnApply2_Click(ByVal sender As System.Object, _
  ByVal e As System.EventArgs) Handles btnApply2.Click
  Dim sort As String
  Dim rowState As DataViewRowState
  ' Указание фильтра.
  dvView2.RowFilter = txtFilter2.Text
  ' Указание сортировки.
  sort = cboSort2.SelectedItem
  If chkDesc2.Checked Then
   sort = sort & " DESC"
  End If
  dvView2.Sort = sort
  ' Указание состояние записи.
  dvView2.RowStateFilter = rowState.Parse(rowState.GetType, _
   cboRowState2.SelectedItem)
 End Sub
End Class

Подпрограмма frmDataViews_Load инициализирует разные объекты формы. Сначала создается объект DataAdapter, который затем используется для загрузки данных из таблицы базы данных в таблицу Customers набора данных DataSet. Далее создаются два представления данных: одно будет содержать создаваемое по умолчанию представление, а другое — новое представление dvView2. Далее объект-представление dvView2 инициализируется для отображения всех текущих записей с сортировкой по фамилии, т.е. по полю LastName.

После этого инициализируются два набора полей со списками. В поле со списком cboSort загружается список имен полей таблицы Customers, а в поле со списком cboRowState — список значений перечисления DataViewRowState.

НА ЗАМЕТКУ

В Visual Basic больше не поддерживается свойство ItemData. Дело в том, что вместо него для преобразования значений перечисления в строки для загрузки их в поле со списком используется метод GetNames перечисления. Аналогично, метод Parse перечисления используется для преобразования строк в значения перечисления при присвоении избранных значений свойству RowStateFilter.

Затем для элементов управления с критериями отбора записей задаются значения по умолчанию, т.е. исходный порядок сортировки для обоих представлений задается по полю ID. Наконец, каждое представление связывается с одной из сеток данных, что приводит к отображению в них всех текущих данных.

Избранные значения критериев применяются для соответствующего представления после щелчка на кнопке Apply. Две подпрограммы btnApplyl_Click и btnApply2_Click идентичны, за исключением того, что они относятся к разным наборам элементов управления. Фильтр записей (значение свойства RowFilter) задается на основании указанного текста в текстовом поле txtFilter, порядок сортировки (значение свойства Sort) — на основании выбранного поля в поле со списком cboSort (с дополнительным модификатором DESC нисходящего порядка), а фильтр состояния записи (значение свойства RowStateFilter) — на основании значения в поле со списком cboRowState2. Изменение свойств представлений, связанных с сетками данных, приводит к автоматическому отображению данных с новыми параметрами представления.

Скомпонуем проект DataSetCode и запустим полученное приложение. Щелкните на кнопке Data Views для отображения новой формы frmDataViews. Внесите необходимые изменения в критерии сетки и щелкните на кнопке Apply для внесения этих изменений в соответствующую сетку. На рис. 7.4 показан пример отображения данных из одной таблицы в двух разных представлениях.

Попробуйте выбрать разные поля сортировки и состояния записей для организации разных представлений. Попробуйте использовать разные фильтры, например сложные выражения ID > 10 AND ID < 18 или LastName Like с. Более подробные сведения о правилах создания фильтров приводятся в разделе с описанием свойства DataColumn.Expression справки Visual Studio .NET.

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


РИС. 7.4. Пример отображения данных из одной таблицы в двух разных представлениях формы frmDataViews

НА ЗАМЕТКУ

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

Оглавление книги


Генерация: 1.410. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз