Vb.net 基于具有ForeignKeyConstraint的父数据表筛选子数据表

Vb.net 基于具有ForeignKeyConstraint的父数据表筛选子数据表,vb.net,Vb.net,我在SQLServer中有一个存储过程,它将两个表返回到我的VB.Net表单。这两个表填充两个网格。我的数据表是父表和子表。我想按第一个网格过滤第二个网格。换句话说,当用户在第一个网格中选择一条记录时,第二个网格必须根据以编程方式声明的主键进行过滤。 但它不起作用! 我的代码如下所示: Dim DAContractorDateTreeView As New SqlDataAdapter("spTimeSheetReportDateTree", My.Settings.SyncConnection

我在SQLServer中有一个存储过程,它将两个表返回到我的VB.Net表单。这两个表填充两个网格。我的数据表是父表和子表。我想按第一个网格过滤第二个网格。换句话说,当用户在第一个网格中选择一条记录时,第二个网格必须根据以编程方式声明的主键进行过滤。 但它不起作用! 我的代码如下所示:

Dim DAContractorDateTreeView As New SqlDataAdapter("spTimeSheetReportDateTree", My.Settings.SyncConnectionString)
Dim DSContractorDate As New DataSet
Dim fkeyConstraint As ForeignKeyConstraint
Dim Binding1, Binding2 As New BindingSource

Sub LoadContractorsDate(MyParameter As Integer)
    Try
      DAContractorDateTreeView.SelectCommand.CommandType = CommandType.StoredProcedure
      'Some Codes for adding parameters
      DAContractorDateTreeView.Fill(DSContractorDate)

      'Declare parent column and child column variables.
      Dim ParentColumn, ChildColumn As DataColumn
      Dim primaryKey(1) As DataColumn
      primaryKey(0) = DSContractorDate.Tables(2).Columns("TiSheID")
      DSContractorDate.Tables(2).PrimaryKey = primaryKey

      'Set parent and child column variables.
      ParentColumn = DSContractorDate.Tables(0).Columns("TiSheID")
      ChildColumn = DSContractorDate.Tables(1).Columns("TiSheID")
      fkeyConstraint = New ForeignKeyConstraint("FKConstraintNaID", ParentColumn, ChildColumn)

      'Set null values when a value is deleted.
      fkeyConstraint.DeleteRule = Rule.Cascade
      fkeyConstraint.UpdateRule = Rule.Cascade
      fkeyConstraint.AcceptRejectRule = AcceptRejectRule.Cascade

      'Add the constraint, and set EnforceConstraints to true.
      DSContractorDate.Tables(1).Constraints.Add(fkeyConstraint)

      DSContractorDate.EnforceConstraints = True

      Binding1.DataSource = DSContractorDate.Tables.Item(0)
      GridControlExit.DataSource = Binding1
      Binding1.DataMember = "TiSheID"

      Binding2.DataMember = "FKConstraintNaID" 'fkeyConstraint.ConstraintName
      MsgBox(fkeyConstraint.ConstraintName)
      Binding2.DataSource = Binding1
      GridControlDetail.DataSource = Binding2

    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub
我对从存储过程加载数据没有任何问题。
请帮帮我。提前感谢。

您现在可能已经找到了解决方案,但Microsoft的目标是:

  • 将新数据集添加到项目中
  • 打开它并在曲面上单击鼠标右键
  • select*from parent
  • 对孩子也这样做。如果数据库包含外键,则会自动创建数据关系。如果不是,则高亮显示父级中链接到子级的列,然后从列名旁边的灰色方框中拖动一条线,并将其放到相关子列名上,确保datarelation窗口设置正确
  • 保存数据集并转到表单
  • 打开数据源窗口(查看菜单,其他窗口),展开每个节点并查看它。您将看到两个孩子,一个在家长之下,另一个不在家长之下 *将这三个网格全部放在表单上,运行应用程序
您会注意到,对于父网格下的网格,当您选择父网格时,子网格将自动过滤。如果您停止应用程序并检查子网格的数据源,您将看到原因。两个网格的数据源都是bindingsources,但对于自动过滤的网格,相关bindingsource的数据源设置为父bindingsource,其DataMember是datarelation的名称

您可能可以将其复制到您的手动代码中,但请考虑开始使用数据集和TableAdapter;它们使您现在编写的许多代码变得更简单、更实用

最后一点;配置适配器时,您进行了查询“从表中选择*”。在生产中,你不会这样做;不要下载所有的表数据并对子表进行筛选。向TableAdapter添加多个相关查询并使用它们<代码>从lastname(如@ln)所在的用户中选择*并将其命名为fillbylastname,如果需要通配符,请将其放入代码中:
UserStableApter.fillbylastname(appDataSet.users,“Smi%”)