車の情報まとめアプリ03(メーカー名に応じて車両名を入れる)
■2つ目のドロップダウンリストにメーカー名毎に車両名をいれる。
前回、メーカー名を選択できるようにした。今回は、選択したメーカーの車両のみを2つ目のドロップダウンリストで表示できるようにする。
前回はXPathSelectElementsのメソッドを使って、直接<Brand></Brand>の要素部分を回収するようにしたけど、ファイルから回収する情報は、<Vehicle></Vehicle>部分の要素とする。回収した要素は、XElementのコレクションのオブジェクトとなる。そのコードが下のもの。
VehicleList_ = System.Xml.XPath.Extensions.XPathSelectElements(xdoc, "./VehicleInfoList/Vehicle")
For Each el As XElement In VehicleList_
Debug.WriteLine(el.Value)
Dim temp = el.Descendants("Brand")
If (DropDownList1.Items.Contains(New ListItem(temp.Value))) Then
Else
DropDownList1.Items.Add(temp.Value)
End If
Next
ここで、VehicleList_ は、IEnumerable(Of XElement) というクラス。これを基に、XElementを操作してメーカー名や車両名を取り出す。
まず、上の例では、Descendants("Brand")のメソッドで、<Vehicle></Vehicle>要素の子の部分にあたる<Brand></Brand>を取りだす。これを重複しないようにドロップダウンリストに入れる。
次に、ドロップダウンリスト1の値が変更されたときに、下のメソッドを呼び出して、2つ目のドロップダウンリストに車両名を入れていく。
Protected Sub DropDownList1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles DropDownList1.SelectedIndexChanged
Dim temp = DropDownList1.SelectedValue
DropDownList2.Items.Clear()
For Each el As XElement In VehicleList_
Dim tempBrand = el.Descendants("Brand")
If (temp = tempBrand.Value) Then
Dim tempModel = el.Descendants("VehicleName")
If (DropDownList2.Items.Contains(New ListItem(tempModel.Value))) Then
Else
DropDownList2.Items.Add(tempModel.Value)
End If
Else
End If
Next
End Sub
ここでは、まず今入っている情報を消し(Clear)、選択されているメーカー名と同じ場合だけ、<Vehicle></Vehicle>の子の要素である車両名を取り出し、ドロップダウンリスト2へ入れる。Xmlファイルの中で、車両名を重複しないように入れておけば、重複しないようにする場合分けは不要だけど、とりあえず入れておく。
この実行結果が下のもの。メーカー名を変えるたびドロップダウンリスト2の内容も更新された。
今回のデータでは、<Vehicle></Vehicle>要素に対して、親、子、兄弟は下のようになる。Microsoftのページから使用できるメソッドやプロパティを見ると、親や兄弟の情報も取得や操作ができそう。
次は、車両情報の表示について考える。