我试图从两个具有相同名称但不同ID的xml元素中获取不同的值,这是我的代码:
<?xml version="1.0" encoding="utf-8"?>
<Vehicle_data>
<Data ID="1">
<Vehicle_name>bullet</Vehicle_name>
<Owner_name>qwe</Owner_name>
<Number_plate>q2236</Number_plate>
<Insurance_laps_date>qwe</Insurance_laps_date>
<Chassis_no>wqe</Chassis_no>
<Driving_lic_no>q</Driving_lic_no>
<Entry_date>05-09-15</Entry_date>
<Entry_time>08:36:52</Entry_time>
</Data>
<Data ID="2">
<Vehicle_name>optra</Vehicle_name>
<Owner_name>ott</Owner_name>
<Number_plate>qwerte</Number_plate>
<Insurance_laps_date>gdsfg</Insurance_laps_date>
<Chassis_no>dfgdf</Chassis_no>
<Driving_lic_no>dfgdf</Driving_lic_no>
<Entry_date>05-09-15</Entry_date>
<Entry_time>08:38:34</Entry_time>
</Data>
<Data ID="3">
<Vehicle_name>enzo</Vehicle_name>
<Owner_name>asd</Owner_name>
<Number_plate>awda</Number_plate>
<Insurance_laps_date>adaw</Insurance_laps_date>
<Chassis_no>awdw</Chassis_no>
<Driving_lic_no>adaw</Driving_lic_no>
<Entry_date>05-09-15</Entry_date>
<Entry_time>08:40:26</Entry_time>
</Data>
<Data ID="4">
<Vehicle_name>enzo</Vehicle_name>
<Owner_name>kok</Owner_name>
<Number_plate>asdasd</Number_plate>
<Insurance_laps_date>asfdadsad</Insurance_laps_date>
<Chassis_no>dasdasd</Chassis_no>
<Driving_lic_no>asdasdas</Driving_lic_no>
<Entry_date>05-09-15</Entry_date>
<Entry_time>08:42:05</Entry_time>
</Data>
</Vehicle_data>
为此我在表单加载时使用以下vb代码
Dim doc As XDocument = XDocument.Load(Environment.CurrentDirectory & "\Vehicle_data.xml")
Dim dt As New DataTable
dt.Columns.Add("Name")
dt.Columns.Add("ID")
For Each itm In doc.Descendants("Vehicle_name")
Dim dr As DataRow = dt.NewRow
dr("Name") = itm.Value
dr("ID") = itm.Parent.FirstAttribute.Value
dt.Rows.Add(dr)
Next
ComboBox1.DataSource = dt
ComboBox1.DisplayMember = "Name"
ComboBox1.ValueMember = "ID"
在ComboBox1.SelectedIndexChanged
事件:
Dim doc As XDocument = XDocument.Load(Environment.CurrentDirectory & "\Vehicle_data.xml")
If ComboBox1.SelectedItem.ToString <> "System.Data.DataRowView" AndAlso _
ComboBox1.SelectedValue.ToString <> "System.Data.DataRowView" Then
Dim vehicledata = From el In doc.Element("Vehicle_data").Elements("Data") _
Where (el.Element("Vehicle_name") = ComboBox1.SelectedItem.ToString) _
Select New With
{
.VName = el.Element("Vehicle_name").Value, _
.onr = el.Element("Owner_name").Value, _
.nopl = el.Element("Number_plate").Value, _
.ins = el.Element("Insurance_laps_date").Value, _
.chassis = el.Element("Chassis_no").Value, _
.lic = el.Element("Driving_lic_no").Value, _
.PID = el.Element("Chassis_no").Parent.FirstAttribute.Value
}
For Each el In vehicledata
If ComboBox1.SelectedValue.ToString = el.PID Then
TextBox5.Text = el.VName
TextBox1.Text = el.onr
TextBox2.Text = el.nopl
TextBox3.Text = el.ins
TextBox4.Text = el.chassis
TextBox6.Text = el.lic
End If
Next
End If
我认为el.PID
没有返回任何值。
请帮帮我。
答案 0 :(得分:0)
ComboBox1.SelectedItem.ToString
始终等于"System.Data.DataRowView"
,因此它永远不会进入您的if
声明。不确定为什么你有if
。是在Form_Load
期间阻止此代码运行吗?如果是,那么您应该使用SelectionChangeCommitted
事件而不是SelectedIndexChanged
。
创建一个没有if
的新方法:
Private Sub SetControlValues()
Dim doc As XDocument = XDocument.Load(Environment.CurrentDirectory & "\Vehicle_data.xml")
Dim vehicledata = From el In doc.Element("Vehicle_data").Elements("Data") _
Where (el.Attribute("ID") = ComboBox1.SelectedValue.ToString) _
Select New With
{
.VName = el.Element("Vehicle_name").Value, _
.onr = el.Element("Owner_name").Value, _
.nopl = el.Element("Number_plate").Value, _
.ins = el.Element("Insurance_laps_date").Value, _
.chassis = el.Element("Chassis_no").Value, _
.lic = el.Element("Driving_lic_no").Value, _
.PID = el.Element("Chassis_no").Parent.FirstAttribute.Value
}
For Each el In vehicledata
If ComboBox1.SelectedValue.ToString = el.PID Then
TextBox5.Text = el.VName
TextBox1.Text = el.onr
TextBox2.Text = el.nopl
TextBox3.Text = el.ins
TextBox4.Text = el.chassis
TextBox6.Text = el.lic
End If
Next
End Sub
另请注意更新后的Where
,您需要将SelectedValue
与ID
属性进行比较。
移除SelectedIndexChanged
事件并添加新的SelectionChangedCommitted
事件,只需调用上述方法:
Private Sub ComboBox1_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox1.SelectionChangeCommitted
SetControlValues()
End Sub
最后,要在表单加载期间初始化文本框,请添加对SetControlValues()
的调用作为Form_Load
中的最后一行。