如何在VB.NET中使用XML文件中的多个表来查询数据集以填充DataGrid

时间:2014-10-22 18:45:35

标签: xml vb.net datagrid

这是我第一次在这里发帖,我绝对是VB.NET的新手,所以如果我做错了,请原谅我。

我正在尝试创建一个简单的GUI来更新我们用于登录脚本的驱动器映射的XML。如果这是一个不好的登录脚本方式,请不要评论。

我有一个表格,上面有一个组合框和数据网格。我需要做的是使用我已经完成的OU名称值填充组合框。现在我无法完成的是使用每个OU的映射填充DataGrid。我无法弄清楚的是,当我将XML读入数据集时,它会创建两个表,OU和映射。我想要做的是当我从ComboBox中选择一个OU时,它只使用该OU中的映射填充DataGrid。两个表中都有一个共同的OU_Id字段。我认为这应该像两个表上的选择查询一样简单,但对于我的生活,我无法弄清楚如何完成它。请帮帮我。

以下是XML文件的格式。

<OUs>
    <OU name="ABC - NYO">
        <mapping path="" drive="F:"/>
        <mapping path="\\nyopr901\apps_prod" drive="G:"/>
        <mapping path="" drive="I:"/>
        <mapping path="" drive="J:"/>
        <mapping path="" drive="K:"/>
        <mapping path="" drive="L:"/>
        <mapping path="" drive="M:"/>
    </OU>
    <OU name="ABC - CAL">
        <mapping path="" drive="F:"/>
        <mapping path="\\nyopr901\apps_prod" drive="G:"/>
        <mapping path="" drive="I:"/>
        <mapping path="" drive="J:"/>
        <mapping path="" drive="K:"/>
        <mapping path="" drive="L:"/>
        <mapping path="" drive="M:"/>
    </OU>
</OUs>

到目前为止,这是我的代码。

Public Class frmLoginScriptMaintenance
Public dsDM As New DataSet()

Private Sub frmLoginScriptMaintenance_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' Read in XML from file
    DriveMappings()
    For i = 0 To dsDM.Tables("OU").Rows.Count - 1
        ComboBox1.Items.Add(dsDM.Tables("OU").Rows(i).Item(1))
    Next
    ' Bind DataSet to Data Grid
    'grdData.DataMember = "mapping"
    'grdData.DataSource = dsPubs
End Sub

Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    Dim dsDrives As New DataSet()
    Dim expression As String
    ' Read in XML from file
    ' Bind DataSet to Data Grid
**THIS IS WHERE I AM GOING WRONG**
    grdData.DataMember = "mapping"
    grdData.DataSource = dsDM.Tables(1).Select(**NOT SURE WHAT SHOULD GO HERE**)
End Sub

Public Function DriveMappings() As DataSet
    dsDM.ReadXml("DriveMappings.xml")
    Return dsDM
End Function

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

End Sub
End Class

1 个答案:

答案 0 :(得分:0)

将XML加载到DataSet时,会在两个表之间创建关系。您可以使用DataRow.GetChildRows方法导航此关系。

因此,例如,您可以使用以下内容从OU转到相关映射:

Dim ouRow As DataRow = dsDM.Tables("OU").Rows(0)
' OU_mapping is the default name for the relationship that is generated
Dim mappingRows() as DataRow = ouRow.GetChildRows("OU_mapping")

您可以使用ComboBox1.SelectedIndexSelectedIndexChanged方法的OU表中查找相应的行。

<强>更新

如您所见,绑定到DataRow数组并不能真正满足您的需求。相反,如果您更改了ComboBoxDataGridView绑定,则应在ComboBox选择和DataGridView行之间自动跟踪关系。

Private Sub frmLoginScriptMaintenance_Load(...
    ' Read in XML from file
    DriveMappings()
    ' Bind the ComboBox to the OU table, showing the name column
    ComboBox1.DataSource = dsDM
    ComboBox1.DisplayMember = "OU.name"
    ' Bind the DataGridView to the mapping table, via the relationship, to show
    ' just the rows related to the selected OU
    grdData.DataSource = dsDM
    grdData.DataMember = "OU.OU_mapping"
End Sub

您根本不需要ComboBox1.SelectedIndexChanged处理程序。

注意:在.NET 4.5.2项目中使用标准ComboBoxDataGridView组件进行测试。