none
VB2008(Exp E) における LINQを用いた comboboxのデータソースの動的指定の方法 RRS feed

  • 質問

  • VB2008を学習中のTake'Nと申します。
    web検索もかけてみたのですが、合致する回答を得られなくて
    質問することにいたしました。

    下記のようなテーブル(SQL Svr2008)を作成し、データを入力してあります。
    「t_地域テーブル」を「ComboBox1」に、
    「t_県テーブル」を「ComboBox2」に割り当て、
    「t_地域テーブル」で選択した地域の県名を「ComboBox2」のデータソース
    に割り当てたいのですが、うまく動作しません。

    「Form1」が表示された後、「ComboBox1」で地域を選択すると、
    下記の場所でエラーが発生します。

    ご教授お願いします。

    注:「t_地域」「t_県」は、実際には半角英字で表記してあります。
      見やすくするために、全角表示しました。

    -----------------------------------------------------
    <t_地域テーブル>
    [地域コード],[地域名]

    <t_県テーブル>
    [地域コード],[県コード],[県名]
    -----------------------------------------------------

    Public Class Form1

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Me.T_県__TableAdapter.Fill(Me.Test_2_db_DataSet.t_県)
            Me.T_地域__TableAdapter.Fill(Me.Test_2_db_DataSet.t_地域)

            With Me.ComboBox1
                .DataSource = Me.Test_2_db_DataSet.t_地域
                .DisplayMember = Me.Test_2_db_DataSet.t_地域.Columns(1).ColumnName
                .ValueMember = Me.Test_2_db_DataSet.t_地域.Columns(0).ColumnName
            End With

        End Sub

        Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
            Dim wk_obj As Object = From rs In Me.Test_2_db_DataSet.t_県 _
                                   Where Val(Me.Test_2_db_DataSet.t_県.Columns(0).ToString) = Val(Me.ComboBox1.SelectedValue.ToString) _
                                   Select Me.Test_2_db_DataSet.t_県

            With Me.ComboBox2
                .DataSource = wk_obj ' <=== ここで下記のエラー発生

                .DisplayMember = Me.Test_2_db_DataSet.t_県.Columns(2).ColumnName
                .ValueMember = Me.Test_2_db_DataSet.t_県.Columns(1).ColumnName
            End With

        End Sub

    -----------------------------------------------------
    <エラー内容>
    子ウィンドウ(エラーウィンドウ?)が立ち上がって、

    ArgumenException はハンドルされませんでした。

    Complex DataBinding は IList または IListSource のどちらかをデータソースとして受け入れます。

    とのメッセージが表示されます。

    2008年9月11日 1:03

回答

  • Hongliang さま。
    ご教授ありがとうございます。

    教授いただいた内容が、当方の技量では実現できませんでしたので
    結局、ストアドプロシージャを新規に作り、パラメータを渡すことで、Combobox2のデータを
    動的に変化させることができました。

    AccessVBAでしたらそれなりに経験があるのですが、やはりというべきか
    VB.netは一筋縄ではいかないようです。

    もう少し、勉強してみます。
    どうもありがとうございました。
    2008年9月11日 8:57

すべての返信

  • LINQ to DataSet の Select は EnumerableRowCollection(Of T) を返すみたいですが、このクラスは IEnumerable(Of T) しか実装しません。
    ComboBox の DataSource に使えるのはエラー通りのものですので、当然そのままでは使えないことになります。
    ToArray や ToList(配列や List
    (Of T) は IList を実装します)、CopyToDataTable(DataTable は IListSource を実装します)などの拡張メソッドを使用して DataSource に使用できるオブジェクトに変換しなければなりません。

    ところで、LINQ の返値を As Object で受け取るべきではありません。
    Dim obj = From ...
    と型を指定せずに宣言と同時に代入するようにすれば、この変数 obj は型推論により最適な型にコンパイル時に解決されます(今回の場合は EnumerableRowCollection
    (Of DataRow) かな)。そうすれば ToArray のような拡張メソッドも適用可能になります。
    2008年9月11日 3:51
  • Hongliang さま。
    ご教授ありがとうございます。

    教授いただいた内容が、当方の技量では実現できませんでしたので
    結局、ストアドプロシージャを新規に作り、パラメータを渡すことで、Combobox2のデータを
    動的に変化させることができました。

    AccessVBAでしたらそれなりに経験があるのですが、やはりというべきか
    VB.netは一筋縄ではいかないようです。

    もう少し、勉強してみます。
    どうもありがとうございました。
    2008年9月11日 8:57