这是我第一次在这里发帖,我绝对是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
答案 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.SelectedIndex
在SelectedIndexChanged
方法的OU表中查找相应的行。
<强>更新强>
如您所见,绑定到DataRow
数组并不能真正满足您的需求。相反,如果您更改了ComboBox
和DataGridView
绑定,则应在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项目中使用标准ComboBox
和DataGridView
组件进行测试。