none
WPF SQLサーバーからのクエリーをDataGridに表示したい RRS feed

  • 質問

  • SQLサーバーからの簡単なクエリーを、WPFのDataGridに表示したい。これだけをやりたいのですが、思ったように動作しません。

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
        <Grid Height="342">
            <DataGrid AutoGenerateColumns="False" Height="98" HorizontalAlignment="Left" Margin="39,37,0,0" Name="DataGrid1" VerticalAlignment="Top" Width="210" RowHeight="20" />
            <DataGrid AutoGenerateColumns="False" Height="98" HorizontalAlignment="Left" Margin="39,169,0,0" Name="DataGrid2" RowHeight="20" VerticalAlignment="Top" Width="210" />
        </Grid>
    </Window>


       Private Sub Test0()

            Dim cnnst As String = "Persist Security Info=true;" & _
            "Data Source=SQLserver;" & _
            "Initial Catalog=t_00;" & _
            "User ID=sa;" & _
            "Password=XXXX"

            Dim MySQL As String = "SELECT * FROM TABLE1"

            Dim connection As SqlConnection = New SqlConnection()
            Dim command As SqlCommand = New SqlCommand()
            Dim dss As DataSet = New DataSet("TABLE1")


            Dim adapter As SqlDataAdapter = New SqlDataAdapter()

            connection.ConnectionString = cnnst
            command.Connection = connection
            command.CommandText = MySQL
            adapter.SelectCommand = command
            adapter.Fill(dss)

            'ここでdssに正常にQueryの結果が格納されていることは確認できている
            Dim table As DataTable
            Dim row As DataRow
            Dim column As DataColumn
            Dim s As String

            For Each table In dss.Tables
                For Each row In table.Rows
                    s = ""
                    For Each column In table.Columns
                        s &= row(column) & " "
                    Next column
                    Debug.Print(s)
                Next row
            Next table

            '------------

            Dim tbv As New DataView
         tbv.Table = dss.Tables("TABLE1")

            'どちらにもテーブルの内容が表示されない
            Me.DataGrid1.ItemsSource = tbv
            Me.DataGrid2.DataContext = dss

        End Sub

    途中、dss (DataSet型オブジェクト)の内容をテキストで出力していますが、行、列共に正常に表示されます。

    しかし、Me.DataGrid2.DataContext = dssとしても、空の行が1行表示されるのみです。
    DataViewを使った例も参考に付けましたが、Me.DataGrid1.ItemsSource = tbv も同じく、空の行が1行表示されるのみです。

    色々なWEBサイトのサンプルプログラムを参考にしてコードを書いたのですが、これ以上どうやったら良いのか分かりません。御教授を御願い致します。

    なお、dss (DataSet型オブジェクト)のテーブル構成をModifyしてMe.DataGrid2.DataContext = dssが正常動作できるようにする方法は分かりますが、面倒な処理を加えたくないので、最少のコードでDataGridに表示できる方法を教えて下さい。
    2016年5月9日 7:11

回答

  •  tbv.Table = dss.Tables("TABLE1")

    としていますが、tbvにちゃんと格納されていますか?
    TABLE1はデータセット名です。

    dss上にFillしたテーブルがなんという名称で格納されているのか確認してみてください。

    また、テーブル名をTABLE1としたい場合は試しに以下のようにFill時に指定してみてください。
    adapter.Fill(dss, "TABLE1")


    2016年5月9日 8:30
    モデレータ

すべての返信

  • こんにちは。

    Me.DataGrid1.ItemsSource = tbv、で良いとは思いますが、
    XAML側でAutoGenerateColumns="False"にしていながらカラム定義をしていないのは何故でしょう。

    試しにAutoGenerateColumns="True" にしてみたら表示されないでしょうか。
    自動生成したくない場合はカラム定義を行って、各列に対してバインドするパラメータを指定すれば表示されると思います。

    列定義方法は以下などを参考にしてみてください。

    【WPF】DataGridの基本「カラムをXAMLで指定する」

    2016年5月9日 7:28
    モデレータ
  • Tak1waさん、ありがとうございます。
    AutoGenerateColumns="True"にしてみても同じ結果です。

    他の色々なWEBサイトでは、列に対してバインディングを個別に設定しなくてもMe.DataGrid1.ItemsSource = tbvで表示が完成しています。


    2016年5月9日 8:06
  •  tbv.Table = dss.Tables("TABLE1")

    としていますが、tbvにちゃんと格納されていますか?
    TABLE1はデータセット名です。

    dss上にFillしたテーブルがなんという名称で格納されているのか確認してみてください。

    また、テーブル名をTABLE1としたい場合は試しに以下のようにFill時に指定してみてください。
    adapter.Fill(dss, "TABLE1")


    2016年5月9日 8:30
    モデレータ
  • Tak1waさん、御教授ありがとうございました。
    adapter.Fill(dss, "TABLE1")と書き換えたら動作しました。

    これでプログラム開発が大きく進みます。どうもありがとうございました!

    2016年5月9日 8:38
  • 余談ですが、Fill時にテーブル名を指定しなかった場合、テーブル名は既定でTableという名前になります。結果セットが複数ある場合は、Table、Table1、Table2、・・・のように続いていきます。
    なので、tbv.Table = dss.Tables("TABLE1")と書かれたのは、これ関連の記事を見られたのかもしれませんね。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2016年5月10日 1:09
    モデレータ