dsEmployeeInfo.Tables("Departments").Rows(row)(col))
Next col
Me.lstOutput.Items.Add("============")
Next row
End Sub
Аналогично можно создать подпрограмму более общего типа для обхода не только записей и полей, но и таблиц объекта DataSet, как показано в листинге 5.5.
ЛИСТИНГ 5.5. Код обхода таблиц из объекта DataSetPrivate Sub DisplayDataSet(ByVal ds As DataSet)
' Общая подпрограмма для отображения содержимого объекта DataSet.
' Отображаемый объект DataSet передается как параметр.
Dim dt As DataTable
Dim dr As DataRow
Dim dc As DataColumn
Me.lstOutput.Items.Add("DISPLAY DATASET")
Me.lstOutput.Items.Add("============")
For Each dt In ds.Tables
Me.lstOutput.Items.Add(")
Me. lstOutput.Items.Add("TABLE: " & dt.TableName)
Me.lstOutput.Items.Add(" ")
For Each dr In dt. Rows
For Each dc In dt.Columns
Me.lstOutput.Items.Add(dc.ColumnName S ": " & dr(dc))
Next
Me.lstOutput.Items.Add ("============")
Next
Next dt
End Sub
Обратите внимание, что здесь перегружается уже упомянутый ранее метод DisplayDataSet, который теперь принимает в качестве параметра объект DataSet.
Попробуйте запустить полученное приложение; для этого введите упомянутый ранее код в проект DataSetCode и щелкните на кнопке Create DataSet. В результате этого действия создается объект DataSet и наполняется данными, которые затем отображаются в текстовом поле формы, как показано на рис. 5.2.
РИС. 5.2. Результат создания объекта DataSet с таблицами Employees и Departments, наполнения их данными и последующего отображения
НА ЗАМЕТКУДля проверки обобщенной версии подпрограммы DisplayDataSet в подпрограмме btnCreateDS_Click следует заменить вызов ее исходной версии DisplayDataSet новой перегруженной версией DisplayDataSet(dsEmployeeInfо) с параметром dsEmployeeInfo.
Поиск, фильтрация и сортировка записей
Иногда нужно работать не со всеми, а только с некоторыми записями объекта DataSet, например с одной записью или подмножеством всех записей. Для этого можно использовать методы Find и Select.
Метод Find принадлежит свойству DataRowCollection объекта DataTable, который используется для поиска и возвращения единственной строки, указанной с помощью значения первичного ключа таблицы.
Перед использованием метода Find для обнаружения некоторой строки в таблице Departments, которая определена в листинге 5.1, нужно определить первичный ключ таблицы. Это можно сделать с помощью присвоения одного или нескольких полей свойству PrimaryKey таблицы. (Даже если первичный ключ создан на основе единственного поля, свойство PrimaryKey таблицы является массивом объектов DataColumn.)
В приведенных ниже строках кода, которые следует добавить в конце подпрограммы CreateDataSet из листинга 5.1, первичный ключ таблицы Departments создается на основе поля DepartmentName.
Dim pk(0) As DataColumn
pk(0) = dtDepartments.Columns("DepartmentName")
dtDepartments.PrimaryKey = pk
НА ЗАМЕТКУПри создании первичного ключа с помощью свойства PrimaryKey для объекта DataTable на основе одного поля для свойства AllowDBNull этого поля автоматически задается значение False, а для свойства Unique — значение True. А если первичный ключ создан на основе нескольких полей, то только для свойства AllowDBNull этих полей автоматически задается значение False.
После определения первичного ключа метод Find используется так, как показано ниже.
Dim desiredRow As DataRow
desiredRow = dtDepartments.Rows.Find("sales")
Здесь переменной desiredRow присваивается объект DataRow с указанным значением первичного ключа или значение Nothing, если такая запись не будет найдена.
Если первичный ключ таблицы основан на нескольких полях, то соответствующие значения первичного ключа передаются в виде элементов массива (типа Object) методу Find.
' Указание первичного ключа.
Dim pk(0) As DataColumn
pk(0) = dtEmployees.Columns("FirstName")
pk(1) = dtEmployees.Columns("LastName")
dtEmployees.PrimaryKey = pk
' Попытка поиска нужной записи.
Dim desiredRow As DataRow
Dim desiredValues (1) As Object
desiredValues(0) = "Sam"
desiredValues(1) = "Johnson"
desiredRow = dtEmployees.Rows.Find(desiredValues)
Метод Select объекта DataTable возвращает массив объектов DataRow. Возвращаемые строки могут соответствовать критерию фильтрования, порядку сортировки и/или спецификации состояния (объект DataViewRowState пространства имен System.Data).
Приведенный ниже код возвращает и отображает имена всех сотрудников с фамилией Johnson.
Dim selectedRows () As DataRow
selectedRows = dtEmployees.Select("LastName = 'Johnson'")
Dim i As Integer
For i = 0 to selectedRows.GetUpperBound(0)
MessageBox.Show(selectedRows(i)("FirstName"))
Next
Для возврата записей, отсортированных в порядке убывания, можно отредактировать строку с методом Select так, как показано ниже.
selectedRows = dtEmployees. Select ("LastName = 'Johnson'", "FirstName DESC")
Наконец, указание состояния записи в качестве аргумента метода Select позволяет извлекать записи с определенной версией данных непосредственно в процессе их редактирования. Например, для извлечения всех исходных значений записей даже после их редактирования (но еще до вызова метода AcceptChanges) следует указать значение OriginalRows перечисления DataViewRowState, как показано ниже.