車の情報まとめアプリ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のページから使用できるメソッドやプロパティを見ると、親や兄弟の情報も取得や操作ができそう。


次は、車両情報の表示について考える。