Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 链接两个DataGridView_Vb.net_Oracle - Fatal编程技术网

Vb.net 链接两个DataGridView

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"

我在VB.Net Winform应用程序中有两个网格控件连接到Oracle数据库。第一个显示了表1,其中包含字段ID和TaskName。第二个显示了一个链接表,其中包含任务中的字段。在应用程序的逻辑中,两个表是链接的(表1,字段ID)(表2,字段任务)

在第一个DataGridView中选择一行时,我希望在第二个GridView中只选择链接行,但我无法使其工作

    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的数据源。