none
DataView.Sort指定によるDataGridViewへの反映について RRS feed

  • 質問

  • お世話になっております。

    VB.NETでフォームアプリを作成しています。
    DataGridViewとDataSet(DataTable1つ)のオブジェクトが1つずつあり、バインドしています。
    (DataGridView オブジェクトのDataSource = DataSetのオブジェクト、
     DataGridView オブジェクトのDataMember = DataSetのオブジェクト内のテーブルオブジェクト)

    このグリッド(DataGridView)のある列についてカスタマイズした並べ替え(ソート)を行いたいので
    該当ColumnのSortMode = Programmatic
    とし、
    ColumnHeaderMouseClick イベントに、次のようなコードを記載しました。

    Private Sub datagridview1_ColumnHeaderMouseClick(...) Handles ....
        If e.ColumnIndex = 0 Then
            Dim dt As System.Data.DataTable = CType(datagridview1.DataSource, System.Data.DataSet).Tables(0)

            Select Case datagridview1.Columns(0).HeaderCell.SortGlyphDirection
                Case SortOrder.None, SortOrder.Descending
                    dt.DefaultView.Sort = "Column1 ASC"
                    datagridview1.Columns(0).HeaderCell.SortGlyphDirection = SortOrder.Ascending
                Case SortOrder.Acsending
                    dt.DefaultView.Sort = "Column1 DESC"
                    datagridview1.Columns(0).HeaderCell.SortGlyphDirection = SortOrder.Descending
            End Select
        End If
    End Sub

    グリッドの該当列(一番左)のヘッダをクリックすると
    上記のコードを通過し、ヘッダに表示されるグリフ(記号)も表示が切り替わります。

    しかし、肝心のグリッド表示自身の並び替えがされません。

    DataViewを更新したあと、
    グリッドの中身は何かメソッドを呼ばないと表示を更新(反映)しないのでしょうか?

    ご存知の方、ご教示のほどお願い致します。

    2010年12月15日 9:19

回答

  • DataMemberを使わずに、DataSourceにDataTableもしくはDataViewをセットすればうまくいくはずです。もしくはBindingSourceを使います。通常はBindingSourceを使うのがお勧めです。バインディングうに関する多くの機能を提供してくれるからです。

    Dim bs = new BindingSource(dataSet1, "Table1")
    dataGridView1.DataSource = bs

    ソートは、

    CType(datagridview1.DataSource, BindingSource).Sort = "Column1 ASC"

    #上記のコードは空で書いているので間違いがあったらごめんなさい。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク koma_deko 2010年12月27日 8:29
    2010年12月15日 13:48
    モデレータ

すべての返信

  • DataMemberを使わずに、DataSourceにDataTableもしくはDataViewをセットすればうまくいくはずです。もしくはBindingSourceを使います。通常はBindingSourceを使うのがお勧めです。バインディングうに関する多くの機能を提供してくれるからです。

    Dim bs = new BindingSource(dataSet1, "Table1")
    dataGridView1.DataSource = bs

    ソートは、

    CType(datagridview1.DataSource, BindingSource).Sort = "Column1 ASC"

    #上記のコードは空で書いているので間違いがあったらごめんなさい。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク koma_deko 2010年12月27日 8:29
    2010年12月15日 13:48
    モデレータ
  • trapemiya 様

    ご返信が遅くなりまして、申し訳御座いませんでした。

    どうも有り難う御座いました。
    おかげさまで
    BindingSourceを使うことで、無事グリッドのソートが出来ました。

    DataGridViewのプロパティブラウザで
    なぜだかDataSourceにテーブルやビューを指定できず、
    DataSetのオブジェクト丸ごとしか選択できませんでした。

    それもあって、BindingSourceを利用すべく、
    ご教示いただいたようにForm.Loadイベントで、
     bs = New BindingSource(dataset1, "Table1")
     datagridview1.DataSource = bs
    として、データセットとグリッドとをバインドさせ、
    datagridmain1_ColumnHeaderMouseClickイベントで
    グリフの向きに応じて
     bs.Sort = "Column1 ASC" または bs.Sort = "Column1 DESC"
    を行うようにして、うまくソートが動くようになりました。

    2010年12月27日 8:42