0

Entity Framework を使用しています。エンティティ セットを標準の DataGridView コントロールにバインドすると、ヘッダーのクリックによる並べ替え機能が失われます。最初にエンティティ セットをバインド ソースにバインドしようとしましたが、結果は同じです。

また、コードから列を並べ替えようとすると、インターフェイスが実装されていないという例外が発生します... 標準の EF クラスは並べ替えできませんか (残念です)? 言うまでもなく、DataView がデータ ソースとして提供されている場合、並べ替えは機能します。

どうすればこの問題を回避できますか? ありがとう。

4

1 に答える 1

0

パーティーに遅れましたが、少なくとも回答を投稿したいと思いました...大騒ぎせずにこれを達成するには2つの方法があります(実際には同じ方法ですが、ルートがわずかに異なります)。

したがって、基本的な EF コンテキスト クエリ、実行前があります。

var query = context.Projects
    .Where(x => x.Division == selectedDivision);

クエリをロードして、エンティティがローカル キャッシュにあるようにします。次に、DGV のバインディング ソースをローカル キャッシュの同期された BindingList にポイントします。

query.Load();
projectBindingSource.DataSource = context.Projects.Local.ToBindingList(); 

または...変更の追跡やキャッシュが他の操作の「邪魔になる」ことを望まない/必要としない場合があったため、追跡されないコレクションが必要でした。

追跡せずにクエリを実行し、その結果を ObservableCollection にロードします (これが .Local です)。DGV のバインディング ソースを ObservableCollection の同期された BindingList に向ける

var locs = new ObservableCollection<Location>(query.AsNoTracking().ToList());
locationBindingSource.DataSource = locs.ToBindingList();

すべてのテキスト、数値、およびブール値の列では、ヘッダー クリックの並べ替えが有効になります。ソートされないのは、ナビゲーション プロパティの列です。プロジェクトに所有者ナビゲーション プロパティがあるとします。これは、所有者エンティティの ToString() オーバーライドが Owner.FullName プロパティを表示しているためです。FullName 値を持つ所有者列が表示されますが、ソーターを想定しています。列の型は System.Data.Entity オブジェクトとして (表示される吹き出しテキストではなく) 認識されるため、既定のソーターはありません。

于 2013-02-14T17:25:21.960 に答える