Dim As DataRelation
CreateDataSet()
' Создание отношения между таблицами Departments и Employees.
rel = dsEmployeeInfо.Relations.Add(_
"relDepartmentEmployees", _
dsEmployeeInfo.Tables("Departments").Columns("ID"), _
dsEmployeeInfo.Tables("Employees").Columns("DepartmentID"))
DisplayRelations(dsEmployeeInfo)
End Sub
Private Sub DisplayRelations(ByVal ds As DataSet)
Dim rel As DataRelation
' Вывод имен полей созданного отношения.
Me.lstOutput.Items.Add("")
Me.lstOutput.Items.Add("DISPLAY RELATIONS")
For Each rel In ds.Relations
' Вывод имени отношения.
Me.lstOutput.Items.Add("NAME: " & rel.RelationName)
' Вывод имени родительской таблицы и ее поля,
' которое входит в созданное отношение.
Me.IstOutput.Items.Add("PARENT: " & _
rel.ParentTable.ToString & " – " & _
rel.ParentColumns(0).ColumnName)
' Вывод имени дочерней таблицы и ее поля,
' которое входит в созданное отношение.
Me.lstOutput.Items.Add("CHILD: " & _
rel.ChildTable.ToString & " – " & _
rel.ChildColumns(0).ColumnName)
Next
Me.lstOutput.Items.Add("")
End Sub
Сначала нужно создать объект DataRelation. Каждый объект DataSet содержит коллекцию отношений, которая доступна как свойство этого объекта Relations. Это свойство имеет тип DataRelationCollection и поддерживает несколько перегруженных версий метода Add. Версия, использованная в листинге 5.6, принимает три аргумента: имя отношения, ссылку на объект DataColumn в родительской таблице, а также ссылку на объект DataColumn в дочерней таблице. Если отношение между таблицами охватывает более одного поля, то следует использовать другую версию метода Add с аргументами-массивами объектов DataColumn.
Подпрограмма DisplayRelations циклически обходит все отношения свойства Relations объекта DataSet и выводит в текстовом поле имя отношения, имя родительской таблицы и ее поле, которое входит в созданное отношение, а также имя дочерней таблицы и ее поле, которое входит в созданное отношение.
НА ЗАМЕТКУ
Для создания более обобщенной версии подпрограммы DisplayRelations можно было бы вставить код циклического обхода всех полей в свойствах-массивах РаrentColumns и ChildColumns, а не просто отображать их первые элементы.
После компоновки проекта DataSetCode и запуска полученного приложения щелкните на кнопке Create Relations, и в текстовом поле будет выведена информация о вновь созданном отношении между таблицами Employees и Departments.
Кроме коллекции Relations объекта DataSet, которая содержит все отношения, определенные между таблицами объекта DataSet, каждый объект DataTable также содержит две коллекции отношений (т.е. два свойства): ParentRelations и ChildRelations, которые содержат отношения между данным объектом DataTable и связанной с ним другой (дочерней или родительской) таблицей.
После создания отношения между таблицами можно организовать доступ к связанным данным в них. Начните с создания кнопки и вставки кода, приведенного в листинге 5.7.
1. Создайте новую кнопку непосредственно под кнопкой Create Relations, перетаскивая ее из панели элементов управления.
2. В окне свойств Properties укажите значение btnChildRows для свойства (Name) и значение Child Rows для свойства Text.
3. Вставьте код, показанный в листинге 5.7.
Листинг 5.7. Код отображения родительских и дочерних данных из связанных таблиц
Private Sub btnChildRows_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnChildRows.Click
Dim rel As DataRelation CreateDataSet()
AddData()
' Создание отношения между таблицами Departments и Employees
rel = dsEmployeeInfо.Relations.Add("relDepartmentEmployees", _
dsEmployeeInfo.Tables("Departments").Columns("ID"), _
dsEmployeeInfo.Tables("Employees").Columns("DepartmentID"))
DisplayChildRows(dsEmployeeInfo.Tables("Departments"))
End Sub
Private Sub DisplayChidRows(ByVal dt As DataTable)
Dim rel As DataRelation
Dim relatedRows() As DataRow
Dim row As DataRow
Dim col As DataColumn
Dim i As Integer
Dim rowData As String
Me.lstOutput.Items.Add("")
Me.lstOutput.Items.Add("CHILD ROWS")
For Each row In dt.Rows
For Each rel In dt.ChildRelations
Me.lstOutput.Items.Add(_
dt.TableName & ": " & _
rel.ParentColumns(0).ColumnName & _
"= " & row(rel.ParentColumns(0).ToString))
relatedRows = row.GetChildRows(rel)
' Вывод значений записей.
For i = 0 To relatedRows.GetUpperBound(0)
rowData = "****" & _
rel.ChildTable.TableName & ":"
For Each col In rel.ChildTable.Columns
rowData = rowData & " " & _
relatedRows(i)(col.ToString)
Next col
Me.lstOutput.Items.Add(rowData)
Next i
Next rel
Next row
End Sub
Подпрограмма btnChildRows_Click для обработки щелчков на кнопке Child Rows сначала создает объект DataSet и объекты DataTable с помощью подпрограммы CreateDataSet (код которой приведен в листинге 5.1), а затем наполняет их данными с помощью подпрограммы AddData (код которой приведен в листинге 5.2). После этого между таблицами Employees и Departments создается отношение с помощью кода, который приведен в листинге 5.6. Наконец, для вывода данных из записей в текстовом поле формы вызывается подпрограмма DisplayChildRows, которой в качестве аргумента (родительской таблицы) передается таблица Departments.
Читать дальше