これは実際には問題ではありませんが、さらに懸念事項があるので、ご意見をいただければ幸いです。
Winforms C# .net3.5[sp1] Linq2Sql を使用した Visual Studio 2008 (より具体的にはPLINQO ...これは素晴らしいです!)。+/- 19000 行のデータ (行あたり約 80 バイトのデータ) を返す結果セットがあり、データ取得メソッドをバックグラウンドにプッシュし、それに応じて UI を更新することを選択しました。これはうまくいきます。
ただし、Ling データ取得メソッドにさまざまな戻り値の型を使用すると、パフォーマンスが異なることに気付きました。誰もがList<T>
orIEnumarable<T>
を返し、DataGridView のデータソースをそれに設定することを提案していることは知っていますが、残念ながら、オブジェクトのネイティブな並べ替えはサポートされていません。いくつか掘り下げた後、MSDN here を見つけSortableBindingList<T>
ました。私はそれを適用し、グリッドはそれ自体を設定するのに1秒もかかりませんでした-しかし、列をクリックして並べ替えると、並べ替えを実装するのに1秒強かかりました.
次に、DataTable ルートに進むことにしましたが、ToDataTable メソッドが削除されていることがわかりましたが、さらに掘り下げた後、このMSDN 記事で実装する方法を見つけました。それを適用した後、取得にグリッドにデータを入力するのに約 2 秒かかることがわかりましたが、その後の並べ替え (19000 行で!) は瞬時に行われました!! 当然、私はこのアプローチに固執しました。
また、グリッド内編集/追加/削除を無効にしたことにも注意してください。グリッドは、純粋にデータを表示するためのものです。その他の CRUD 操作は、現在選択されている行 (非表示の主キー列) に従って、ダイアログ フォームによって提供されます。
両方の方法で使用したコードは次のとおりです。
1) ソート可能なバインディング リスト
//declare private member
private SortableBindingList<PdtAllocation> listAlloc = null;
private void RefreshData() {
bcsDataContext ctx = new bcsDataContext();
try {
listAlloc = new SortableBindingList<PdtAllocation>(ctx.PdtAllocation.ToList());
}
catch (Exception) {
throw;
}
finally {
ctx.Dispose();
}
dataGridView1.DataSource = listAlloc;
}
2) CopyToDatatable
//declare private member
private DataTable dt = null;
private void RefreshData() {
dt = new DataTable();
bcsDataContext ctx = new bcsDataContext();
try {
ctx.PdtAllocation.CopyToDataTable(dt, LoadOption.PreserveChanges);
}
catch (Exception) {
throw;
}
finally {
ctx.Dispose();
}
dataGridView1.DataSource = dt;
}
これはおそらく「質問と回答」のケースのように思えることはわかっていますが、あなたの意見と、CopyToDataTable()
ルートに進む際の既知の問題を教えていただければ幸いです。
ありがとうございます....そして長いクエリをお詫びします!