Vb.net 链接两个DataGridView
我在VB.Net Winform应用程序中有两个网格控件连接到Oracle数据库。第一个显示了表1,其中包含字段ID和TaskName。第二个显示了一个链接表,其中包含任务中的字段。在应用程序的逻辑中,两个表是链接的(表1,字段ID)(表2,字段任务) 在第一个DataGridView中选择一行时,我希望在第二个GridView中只选择链接行,但我无法使其工作Vb.net 链接两个DataGridView,vb.net,oracle,Vb.net,Oracle,我在VB.Net Winform应用程序中有两个网格控件连接到Oracle数据库。第一个显示了表1,其中包含字段ID和TaskName。第二个显示了一个链接表,其中包含任务中的字段。在应用程序的逻辑中,两个表是链接的(表1,字段ID)(表2,字段任务) 在第一个DataGridView中选择一行时,我希望在第二个GridView中只选择链接行,但我无法使其工作 Dim SQLQuery As String = "SELECT * FROM SCHEME.ARCH_TASKS"
Dim SQLQuery As String = "SELECT * FROM SCHEME.ARCH_TASKS"
Command = New OracleCommand(SQLQuery, Conn)
DataAdapter = New OracleDataAdapter(Command)
DataSet.Tables.Add(DataTable1)
DataAdapter.Fill(DataTable1)
SQLQuery = "SELECT * FROM SCHEME.ARCH_LINK_ROLE_TASK"
Command = New OracleCommand(SQLQuery, Conn)
DataAdapter = New OracleDataAdapter(Command)
DataSet.Tables.Add(DataTable2)
DataAdapter.Fill(DataTable2)
DataSet.Relations.Add(DataTable1.Columns("ID"), DataTable2.Columns("TASK"))
BindingSource1.DataSource = DataSet
GridControl1.DataSource = BindingSource1.DataSource
GridControl1.DataMember = "Table1"
BindingSource2.DataSource = BindingSource1.DataSource
GridControl2.DataSource = BindingSource2.DataSource
GridControl2.DataMember = "Table2"
以下是我的代码尝试:
Dim SQLQuery As String = "SELECT * FROM SCHEME.ARCH_TASKS"
Conn = New OracleConnection(ConnectionString)
Command = New OracleCommand(SQLQuery, Conn)
DataAdapter = New OracleDataAdapter(Command)
DataSet = New DataSet()
DataTable1 = New DataTable
DataSet.Tables.Add(DataTable1)
DataAdapter.Fill(DataTable1)
DataGridView.DataSource = DataTable1.DefaultView
GridControl1.DataSource = DataTable1.DefaultView
SQLQuery = "SELECT * FROM SCHEME.ARCH_LINK_ROLE_TASK"
Command = New OracleCommand(SQLQuery, Conn)
DataAdapter = New OracleDataAdapter(Command)
DataTable2 = New DataTable
DataSet.Tables.Add(DataTable2)
DataAdapter.Fill(DataTable2)
GridControl2.DataSource = DataTable2
DataSet.Relations.Add(DataTable1.Columns("ID"), DataTable2.Columns("TASK"))
结果如下
正如您所看到的,我手动添加了两个数据表之间的关系,但它并没有真正实现我想要的功能。它只是在第一个网格控件中添加一个子行
我试着应用PeterG的建议,但还是没能奏效
Dim SQLQuery As String = "SELECT * FROM SCHEME.ARCH_TASKS"
Command = New OracleCommand(SQLQuery, Conn)
DataAdapter = New OracleDataAdapter(Command)
DataSet.Tables.Add(DataTable1)
DataAdapter.Fill(DataTable1)
SQLQuery = "SELECT * FROM SCHEME.ARCH_LINK_ROLE_TASK"
Command = New OracleCommand(SQLQuery, Conn)
DataAdapter = New OracleDataAdapter(Command)
DataSet.Tables.Add(DataTable2)
DataAdapter.Fill(DataTable2)
DataSet.Relations.Add(DataTable1.Columns("ID"), DataTable2.Columns("TASK"))
BindingSource1.DataSource = DataSet
GridControl1.DataSource = BindingSource1.DataSource
GridControl1.DataMember = "Table1"
BindingSource2.DataSource = BindingSource1.DataSource
GridControl2.DataSource = BindingSource2.DataSource
GridControl2.DataMember = "Table2"
我错过什么了吗
谢谢。您需要通过bindingsources而不是直接绑定网格。t然后以正常方式设置父bs;但是,对于子bs,将数据源设置为父bs,将datamember设置为关系。请如何操作?或者您有任何示例吗?从工具箱中将bindingsources拖到窗体上;将网格的数据源分别设置为一个bs;根据需要将父网格的数据源/数据成员设置为ds和表;根据我的原始注释设置子bs的datamember和datasource。谢谢PeterG,我试着按照你的建议去做(参见文章中添加的代码),但是我仍然缺少一些东西。我应该补充点什么吗?谢谢您的回答。我的意思是在设计器中完成所有这些,而不是在代码中。但我刚刚发现,您没有使用强类型数据集-使用这些数据集可以为绑定和设计网格列等提供更好的设计时支持。此外,在您添加的代码中,您应该将网格的数据源分配给bs,而不是bs的数据源。