ЛИСТИНГ 5.4. Код отображения данных в объектах DataTable
Private Sub DisplayDataSet()
Dim dr As DataRow
Dim dc As DataColumn
Me.lstOutput.Items.Add("DISPLAY DATASET")
Me.lstOutput.Items.Add("============")
' Отображение данных из таблицы Employees.
For Each dr In dsEmployeeInfo.Tables("Employees").Rows
For Each dc In _
dsEmployeeInfo.Tables("Employees").Columns
Me.lstOutput.Items.Add( _
dc.ColumnName & ": " & dr(dc))
Next
Me.lstOutput.Items.Add ("============")
Next
Me.lstOutput.Items.Add("")
' Отображение данных из таблицы Departments.
' Пример использования индексов вместо оператора For Each.
Dim row As Integer
Dim col As Integer
For row = 0 To dsEmployeeInfo.Tables("Departments").Rows.Count – 1
For col = 0 To dsEmployeeInfo.Tables("Departments").Columns.Count – 1
Me.lstOutput.Items.Add( _
dsEmployeeInfo.Tables("Departments").Columns(col).ColumnName & ":" & _
dsEmployeeInfo.Tables("Departments").Rows(row)(col))
Next col
Me.lstOutput.Items.Add("============")
Next row
End Sub
Аналогично можно создать подпрограмму более общего типа для обхода не только записей и полей, но и таблиц объекта DataSet, как показано в листинге 5.5.
ЛИСТИНГ 5.5. Код обхода таблиц из объекта DataSet
Private 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.
Читать дальше