none
DataGridViewのDatasourceにEntityFrameworkを使用した場合、自動的にSortが出来ない RRS feed

  • 質問

  • とうようと申します。

    VisualStudio2010のVB.netにてDataGridViewにDBの値を表示させているのですが

    DatasourceにEntityFramework4.1のLINQで取得した値をセットした所、表示はされるのですが

    SortModeがAutomaticにもかかわらず、DataGridViewのヘッダクリックによる自動ソートがされません。

    Dim ds = From s In cx.Hoge
                   Select s
    
    DataGridView1.DataSource = ds.ToList


    Dim ds = From s In cx.Hoge
                   Select s
    
    DataGridView1.DataSource = CType(ds, ObjectQuery).Execute(MergeOption.AppendOnly)

    の、2つの方法を試しましたが、いずれもNGでした。

    手動でソート処理を組み込む以外で何か方法があればご教授ください。

    2012年8月15日 6:54

回答

  • DataGridViewのAutomaticによるソートは、IBindingList.SortPropertyプロパティに依っています(IBindingListが必要って記述はどこかにあった気がするんだけれど見つからない)。ですのでこのインターフェイスを実装していないList(Of T)とか、ましてやIEnumerable(Of T)とかでは不可能と言うことになります。

    IBindingListの既定の実装としてBindingList(Of T)が存在していますが、これも既定ではソートは実装しておらず、ソート部分は派生させた上で自分で実装することになります。その実装例は、「SortableBindingList」辺りで検索すればいくつか見つかるようです。

    ところで、「手動でソート処理を組み込む」のを除外されるのは、「何か他に良い案があるに違いないから」でしょうか? それともなにか従うべきコーディングルールの禁止事項に触れるからとかでしょうか?

    • 回答としてマーク toyotoyo 2012年8月16日 0:49
    2012年8月16日 0:29

すべての返信

  • DataGridViewのAutomaticによるソートは、IBindingList.SortPropertyプロパティに依っています(IBindingListが必要って記述はどこかにあった気がするんだけれど見つからない)。ですのでこのインターフェイスを実装していないList(Of T)とか、ましてやIEnumerable(Of T)とかでは不可能と言うことになります。

    IBindingListの既定の実装としてBindingList(Of T)が存在していますが、これも既定ではソートは実装しておらず、ソート部分は派生させた上で自分で実装することになります。その実装例は、「SortableBindingList」辺りで検索すればいくつか見つかるようです。

    ところで、「手動でソート処理を組み込む」のを除外されるのは、「何か他に良い案があるに違いないから」でしょうか? それともなにか従うべきコーディングルールの禁止事項に触れるからとかでしょうか?

    • 回答としてマーク toyotoyo 2012年8月16日 0:49
    2012年8月16日 0:29
  • ありがとうございます。

    IBindingListが必要なのですね。

    手動でソート処理を組み込むのを除外したのは、今後作成するシステムでEntityFrameworkをベースで使っていこうと思っており、毎回毎回手動でソート処理を組み込むのは大変かなと思っていた次第です。

    汎用的なソートを組み込んだクラスを作ってそれをかますのが一番良さそうな気がします。


    2012年8月16日 0:48