BindingSource и родительский DataRelation
У меня есть 4 DataTables:
- PRODUCT: pk_product, name, fk_color, fk_size.
- ЦВЕТ: pk_color, имя.
- РАЗМЕР: pk_size, имя.
- LOG: pk_log, fk_product, дата.
Таблица продукта связана с "основным" BindingSource. Привязка таблицы журналов (дочерних отношений) к мастер-привязке работает как шарм. Но связать таблицу цветов и размеров (родительское отношение) не удается.
Что я делаю неправильно?
Dim data As New DataSet()
With data.Tables.Add("COLOR")
.Columns.AddRange(New DataColumn() {New DataColumn("PK_COLOR", GetType(Int32)), New DataColumn("NAME", GetType(String))})
.PrimaryKey = New DataColumn() {.Columns(0)}
.BeginLoadData()
For pk_color As Integer = 1 To 5
.Rows.Add(pk_color, String.Format("Color #{0}", pk_color))
Next
.EndLoadData()
.AcceptChanges()
End With
With data.Tables.Add("SIZE")
.Columns.AddRange(New DataColumn() {New DataColumn("PK_SIZE", GetType(Int32)), New DataColumn("NAME", GetType(String))})
.PrimaryKey = New DataColumn() {.Columns(0)}
.BeginLoadData()
For pk_size As Integer = 6 To 10
.Rows.Add(pk_size, String.Format("Size #{0}", pk_size))
Next
.EndLoadData()
.AcceptChanges()
End With
With data.Tables.Add("PRODUCT")
.Columns.AddRange(New DataColumn() {New DataColumn("PK_PRODUCT", GetType(Int32)), New DataColumn("NAME", GetType(String)), New DataColumn("FK_COLOR", GetType(Int32)), New DataColumn("FK_SIZE", GetType(Int32))})
.PrimaryKey = New DataColumn() {.Columns(0)}
.BeginLoadData()
Dim pk_product As Integer = 1
For fk_color As Integer = 1 To 5
For fk_size As Integer = 6 To 10
.Rows.Add(pk_product, String.Format("Product #{0}", pk_product), fk_color, fk_size)
pk_product += 1
Next
Next
.EndLoadData()
.AcceptChanges()
End With
With data.Tables.Add("LOG")
.Columns.AddRange(New DataColumn() {New DataColumn("PK_LOG", GetType(Int32)), New DataColumn("FK_PRODUCT", GetType(Int32)), New DataColumn("DATE", GetType(DateTime))})
.PrimaryKey = New DataColumn() {.Columns(0)}
.BeginLoadData()
For pk_log As Integer = 1 To 15
.Rows.Add(pk_log, pk_log, DateTime.Now().AddDays(CDbl(pk_log * -1)))
Next
.EndLoadData()
.AcceptChanges()
End With
Dim productColorRelation As DataRelation = data.Relations.Add("PRODUCT_FK_COLOR", data.Tables("COLOR").Columns("PK_COLOR"), data.Tables("PRODUCT").Columns("FK_COLOR"))
Dim productSizeRelation As DataRelation = data.Relations.Add("PRODUCT_FK_SIZE", data.Tables("SIZE").Columns("PK_SIZE"), data.Tables("PRODUCT").Columns("FK_SIZE"))
Dim logProductRelation As DataRelation = data.Relations.Add("LOG_FK_PRODUCT", data.Tables("PRODUCT").Columns("PK_PRODUCT"), data.Tables("LOG").Columns("FK_PRODUCT"))
data.AcceptChanges()
'Master binding:
Dim productBinding As BindingSource = New BindingSource(data, "PRODUCT")
'Parent bindings: (Do NOT work)
Dim productColorBinding As BindingSource = New BindingSource(productBinding, productColorRelation.RelationName)
Dim productSizeBinding As BindingSource = New BindingSource(productBinding, productSizeRelation.RelationName)
'Child binding:
Dim logProductBinding As BindingSource = New BindingSource(productBinding, logProductRelation.RelationName)
1 ответ
Решение
Если вам нужны отношения с цветом и размером только для отображения связанных данных, вы можете попробовать отменить эти отношения и отключить проверку ограничений. Определите отношения так:
Dim productColorRelation As DataRelation = data.Relations.Add("PRODUCT_FK_COLOR", data.Tables("PRODUCT").Columns("FK_COLOR"),data.Tables("COLOR").Columns("PK_COLOR"),false)
Dim productSizeRelation As DataRelation = data.Relations.Add("PRODUCT_FK_SIZE", data.Tables("PRODUCT").Columns("FK_SIZE"), data.Tables("SIZE").Columns("PK_SIZE"), false)
'Parent bindings: (This should work with the reverse relations)
Dim productColorBinding As BindingSource = New BindingSource(productBinding, productColorRelation.RelationName)
Dim productSizeBinding As BindingSource = New BindingSource(productBinding, productSizeRelation.RelationName)
Удачи!