"", "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
НА ЗАМЕТКУ
Обратите внимание, как разные представления одной таблицы данных отображаются в сетках данных. Если вставить, изменить или удалить запись в одном представлении (и применить изменение за счет перехода к следующей записи), то внесенные изменения будут автоматически отображены в другом представлении (если, конечно, эта запись соответствует заданному фильтру).
Бизнес-ситуация 7.1: просмотр данных из разных источников
Когда компания Jones Novelties, Inc. приняла решение создать новую систему обработки данных, она уже имела прежнюю систему на основе базы данных Access, в которой директор компании Брэд Джонс хранил данные о заказах. Для директора очевидны преимущества перехода к новой системе на основе СУБД SQL Server, но прежде всего он хотел бы гарантировать сохранность унаследованных данных. Поэтому было решено вносить все изменения постепенно, особенно для сохранения данных компании запрошлые годы.
Итак, Джонс хотел бы создать новую систему на основе SQL Server, но иногда использовать старые данные из базы данных Access до тех пор, пока не будет закончена работа над новой системой. Поэтому часть данных должна храниться в одной базе данных, а часть — в другой. Две базы данных должны совместно использовать и даже объединять свои данные, хотя они относятся к разным типам баз данных.
К счастью, это требование легко удовлетворяется в модели ADO.NET. Как уже описывалось выше в главе, для объекта DataSet совершенно не имеет значения, откуда, т.е. из каких источников, берутся данные. Поэтому разработчик базы данных может создать приложение, загружая данные о заказах из таблицы tblOrder базы данных Access, а данные о клиентах — из таблицы 1 базы данных SQL Server. В дальнейшем, после создания в базе данных SQL Server таблицы tblOrder, достаточно будет только изменить строку подключения в объекте DataAdapter, и приложение будет функционировать, как и прежде.
Попробуем создать форму, которая демонстрирует описанный способ работы с данными из разных источников.
1. Запустите интегрированную среду разработки Visual Studio .NET.
2. Создайте новый проект Visual Basic Windows Application. Для этого в диалоговом окне New Project (Новый проект) выберите тип проекта Visual Basic Project в области Project Types (Типы проектов), а затем шаблон Windows Application (Приложение Windows) в области Templates (Шаблоны).
3. Назовите проект BusinessCase71.
4. Укажите путь к файлам проекта.
5. Увеличьте размер формы Form1.
6. В окне Properties укажите значение frmShowOrders для свойства (Name) и значение Show Orders для свойства Text формы Form1.
7. В верхнем левом углу формы создайте текстовое поле и укажите значение txtCustomerID для его свойства (Name), создайте кнопку и укажите значение btnFinds для ее свойства (Name) и значение Find для ее свойства Text, создайте поле со списком и укажите значение lstCustomer с для его свойства (Name). В правой части формы создайте сетку данных и укажите значение grdOrders для ее свойства (Name).
8. Расположите все эти элементы управления так, как показано на рис. 7.5.
9. Перетащите в форму из панели элементов управления компонент DataSet и укажите значение dsCustOrders для его свойства (Name).
10. Создайте новый объект SqlDataAdapter для таблицы tblCustomers базы данных Novelty СУБД SQL Server, перетаскивая его из панели элементов управления. После запуска программы-мастера DataAdapter Configuration Wizard выберите подключение к базе данных Novelty. Затем в диалоговом окне Choose a Query Туре выберите переключатель Use SQL statements.