如何从VB.NET中的XML文件中查询具有多个表的数据集以填充数据网格

如何从VB.NET中的XML文件中查询具有多个表的数据集以填充数据网格,xml,vb.net,datagrid,Xml,Vb.net,Datagrid,这是我第一次在这里发帖,我绝对是VB.NET的新手,所以如果我做错了什么,请原谅我 我试图创建一个简单的GUI来更新用于登录脚本驱动器映射的XML。如果这是一种不好的登录脚本方式,请不要评论 我有一个表单,上面有一个组合框和数据网格。我需要做的是用我已经做过的OU名称值填充组合框。现在我不能做的是用每个OU的映射填充DataGrid。我不明白的是,当我将XML读入数据集中时,它会创建两个表,OU和映射。我想做的是,当我从组合框中选择一个OU时,让它只使用该OU的映射填充DataGrid。两个表中

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

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

我有一个表单,上面有一个组合框和数据网格。我需要做的是用我已经做过的OU名称值填充组合框。现在我不能做的是用每个OU的映射填充DataGrid。我不明白的是,当我将XML读入数据集中时,它会创建两个表,OU和映射。我想做的是,当我从组合框中选择一个OU时,让它只使用该OU的映射填充DataGrid。两个表中都有一个公共OU_Id字段。我认为这应该像在两个表上执行select查询一样简单,但就我的一生而言,我不知道如何完成这项工作。请帮帮我

下面是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>

将XML加载到
数据集中时,将在两个表之间创建一个关系。您可以使用方法导航此关系

例如,您可以使用以下方法从OU转到相关映射:

Dim ouRow As DataRow=dsDM.Tables(“OU”).Rows(0)
'OU_映射是生成的关系的默认名称
Dim mappingRows()作为DataRow=ouRow.GetChildRows(“OU\U映射”)
您可以使用
ComboBox1.SelectedIndex
SelectedIndexChanged
方法中的OU表中找到相应的行

更新

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

专用子系统frmLoginScriptMaintenance\u加载(。。。
'从文件中读取XML
驱动映射()
'将组合框绑定到OU表,显示名称列
ComboBox1.DataSource=dsDM
ComboBox1.DisplayMember=“OU.name”
'通过关系将DataGridView绑定到映射表,以显示
'仅与所选OU相关的行
grdData.DataSource=dsDM
grdData.DataMember=“OU.OU\u映射”
端接头
您根本不需要
组合框1.SelectedIndexChanged
处理程序


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

我无法实现这一点。我更接近了。以下是我所做的更改。私有子ComboBox1\u选择了DexChanged(发送方作为对象,e作为事件参数)Handles ComboBox1.SelectedIndexChanged Dim ouRow作为DataRow=dsDM.Tables(“OU”).Rows(0)“OU\u映射”是作为DataRow=ouRow.GetChildRows(“OU\u映射”)生成的Dim mappingRows()关系的默认名称grdData.DataSource=mappingRows End Sub现在datagrid放置了正确数量的行,但它有列名称,如RowError、RowState、Table、HasErrorsHmm,yes-绑定到
DataRow
数组可能看起来不太好!Oops.:-)我将更新答案,展示如何绑定内容,并让它自动跟踪主/细节关系。马克,非常感谢。我不知道为什么我不想看看Combobox是否能够使用数据源,这太棒了。我会+1你的答案,除非显然我太新了,还不能这么做。非常感谢你的帮助。这个小项目让我很兴奋能重新开始编码。我已经很多年没有做任何编程了。