Showing parent datatable in one datagridview and s

2019-04-16 05:35发布

问题:

Hi I have created a dataset and two datatables. The URLData table is parented to the KeywordData table via the keyword column.

'Create the primary object to hold both data tables
    Dim AllKeyWordInfo As DataSet = New DataSet("AllKeywordInfo")

    'Create a Datatable For keyword Data. Data Tables are stores In the Dataset
    Dim KeywordData As DataTable = AllKeyWordInfo.Tables.Add("Keywords")

    'Create a Datatable For URL Data.
    Dim URLData As DataTable = AllKeyWordInfo.Tables.Add("URLMetrics")

    'Add Columns to our Keyword datatable
    KeywordData.Columns.Add("Keyword")
    KeywordData.Columns.Add("SearchCount")

    'Add Columns to URLDATA
    URLData.Columns.Add("Keyword")
    URLData.Columns.Add("URL")
    URLData.Columns.Add("DA")
    URLData.Columns.Add("PA")

    'Creat a parent child relationship
    AllKeyWordInfo.Relations.Add("ALLDATA", AllKeyWordInfo.Tables("Keywords").Columns("Keyword"), AllKeyWordInfo.Tables("URLMetrics").Columns("Keyword"))

    'parent
    KeywordData.Rows.Add("TESTEST", "1123829")

    'children 
    URLData.Rows.Add("TESTEST", "288789")
    URLData.Rows.Add("TESTEST", "asdsdsdd")


    DataGridView1.DataSource = KeywordData
    DataGridView2.DataSource = URLData

What I would like to do is show everything from the KeywordData table in datagridview1. When a user click on any row (full row select enabled on the datagrid) I would like datagridview2 to show all the child rows for that keyword. Any time the user switches rows in datagridview1 it switches to the proper child rows in datagridview2. Is this possible?

回答1:

The trick is in the binding. Click here for the full solution, which includes creating the DataSet:

Here's the important part, considering that you already have a DataSet containing two DataTables and a DataRelation:

'Bind the parent source to the parent table.
Me.BindingSource1.DataSource = data
Me.BindingSource1.DataMember = "Parent" 'This is the name of the parent DataTable.

'Bind the child source to the relationship.
Me.BindingSource2.DataSource = Me.BindingSource1
Me.BindingSource2.DataMember = "ParentChild" 'This is the name of the DataRelation.

'Bind the parent control to the parent source.
Me.DataGridView1.DataSource = Me.BindingSource1

'Bind the child control to the child source.
Me.DataGridView2.DataSource = Me.BindingSource2

In this case, data is the DataSet. Note that the parent BindingSource is bound to the parent DataTable via the DataSet while the child BindingSource is bound to the DataRelation via the parent BindingSource, rather than being bound to the child DataTable.

Also note that my original example binds to ComboBox controls but, as I say in that thread, the principle is the same regardless of the type of the controls. I've edited the code above to use DataGridView controls instead.