我环顾四周,找不到我需要的东西。
我有一张DB(其他人)3张桌子
SchemeType
Scheme
Type
SchemeType
包含Scheme
和Type
我有一个包含2个组合框的.NET 3.5 WinForm
一个显示Schemes
我希望对方显示所选Types
SchemeType
表格中存在的不同Scheme
。
我有一个DataSet
,其中包含所有3个表的所有条目,并为主 - 外键关系设置了DataRelations。
我正在使用BindingSources来填充组合框,但是当我更改Type
组合框时,无法弄清楚如何让Scheme
组合框刷新它的内容。
我可以通过直接的父子关系来做到这一点,但是无法解决如何编写父子关系的代码。
这是我的代码,删除了不必要的东西
Dim DS As New DataSet("myDS")
Dim SchemeBndSrc As New BindingSource
Dim TypeBndSrc As New BindingSource
Using cmd As New SqlCommand("myStroedProc", _conn)
cmd.CommandType = CommandType.StoredProcedure
Using adp As New SqlDataAdapter(cmd)
adp.Fill(DS)
End Using
End Using
' Name the tables
DS.Tables(0).TableName = "Scheme"
DS.Tables(1).TableName = "Type"
DS.Tables(2).TableName = "SchemeType"
Dim rel As New DataRelation("Scheme-SchemeType", _
DS.Tables("Scheme").Columns("SchemeID"), _
DS.Tables("SchemeType").Columns("SchemeID"), _
True)
Dim rel2 As New DataRelation("Type-SchemeType", _
DS.Tables("Type").Columns("TypeID"), _
DS.Tables("SchemeType").Columns("TypeID"), _
True)
DS.Relations.Add(rel)
DS.Relations.Add(rel2)
' Scheme
' Set up the binding source
SchemeBndSrc.DataSource = DS
SchemeBndSrc.DataMember = "Scheme"
' Bind the bindingsource to the combobox
cboScheme.ValueMember = "SchemeId"
cboScheme.DisplayMember = "SchemeName"
cboScheme.DataSource = SchemeBndSrc
cboScheme.SelectedIndex = -1
' Type
' Set up the binding source
TypeBndSrc.DataSource = SchemeBndSrc
TypeBndSrc.DataMember = "Type-SchemeType"
' Bind the bindingsource to the combobox
cboType.ValueMember = "TypeID"
cboType.DisplayMember = "TypeDesc"
cboType.DataSource = TypeBndSrc
cboType.SelectedIndex = -1
Type组合框不包含任何项目,即使其中至少应包含1个项目。如果我交换DataRelation,它将不会将其添加到DataSet,因为在这种情况下,Parent(SchemeType)没有TypeID的唯一条目。
有人可以帮助我吗?
答案 0 :(得分:0)
您不会通过数据绑定自动完成此操作。数据绑定可以处理基于所选父级的子列表的过滤,因此您可以根据所选的SchemeType
自动过滤Scheme
列表。您当时想要的是根据这些子记录获取所有父Type
条记录,而数据绑定则不会。这必须是手动的。
将您的Scheme
和SchemeType
表格与父母和孩子一样绑定到BindingSource
,并将孩子BindingSource
绑定到DataRelation
父BindingSource
。选择Scheme
并且子BindingSource
自动过滤后,您可以循环浏览它以获取Type
记录的所有ID,并使用它来构建Filter
第三个BindingSource
的值,例如
Dim typeIDs = schemeTypeBindingSource.Cast(Of DataRowView)().
Select(Function(drv) CInt(drv("TypeID")))
typeBindingSource.Filter = String.Fomrat("TypeID IN ({0})",
String.Join(", ", typeIDs))
答案 1 :(得分:0)
我知道这是几年后的事,但是我会这样做的:
在SchemeType数据表上,添加名为ParentTypeDesc的列,并将其.Expression
属性设置为Parent(Type-SchemeType).TypeDesc
-这意味着SchemeType表将针对每个TypeID将其父名称导入自身>
然后设置:
SchemeBindSrc.DataSource = theDataSet
SchemeBindSrc.DataMember = "Scheme"
还有魔法:
TypeBindSrc.DataSource = SchemeBindSrc
TypeBindSrc.DataMember = "Scheme-SchemeType" 'the name of the datarelation
然后绑定到TypeBindSrc的组合具有:
TypeCombo.DisplayMember = "ParentTypeDesc" ' the name of the column that imports the type name along the Type-SchemeType relation