24

私は自分のコントロールにデータを入力するためにBindingSourceコントロール(ここを参照DataGridView)を使用しています。約 1000 件以上のレコードが読み込まれています。そのためにスレッドを使用しています。この場合、DataGridView のパフォーマンスは非常に遅くなります。

DoubleBufferedプロパティをtrue、RowHeadersWidthSizeModedisabled、AutoSizeColumnsModenoneに設定しようとしました。しかし、それでも同じ動作です。

これで私を助けてください。グリッドのパフォーマンスを改善するにはどうすればよいですか。

前もってありがとう、
ビジェイ

4

13 に答える 13

38

10,000 以上のような大量の行がある場合は、パフォーマンス リークを回避するために、データ バインドの前に次の操作を行います。

dataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing; 
// or even better, use .DisableResizing. Most time consuming enum is DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders

// set it to false if not needed
dataGridView1.RowHeadersVisible = false;

データがバインドされた後、再度有効にすることができます。

于 2013-07-22T11:01:39.703 に答える
15

列のサイズを自動調整しないようにしてください。パフォーマンスが向上します。

つまり、これをしないでください:

Datagridview.Columns[I].AutoSizeMode = DataGridViewAutoSizeColumnMode.xxxxx;

于 2013-01-07T18:54:16.773 に答える
15

通常、自動サイズ変更とダブル バッファリングをオフにすると、DataGridView の作成が高速化されます。DGV ダブル バッファリングが正しくオンになっているかどうかを確認します。

if (!System.Windows.Forms.SystemInformation.TerminalServerSession)
{
  Type dgvType = dataGridView1.GetType();
  PropertyInfo pi = dgvType.GetProperty("DoubleBuffered",
    BindingFlags.Instance | BindingFlags.NonPublic);
  pi.SetValue(dataGridView1, value, null);
}

WinAPI WM_SETREDRAWメッセージで再描画を無効にすることも役立ちます。

// *** API Declarations ***
[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);
private const int WM_SETREDRAW = 11;

// *** DataGridView population ***
SendMessage(dataGridView1.Handle, WM_SETREDRAW, false, 0);
// Add rows to DGV here
SendMessage(dataGridView1.Handle, WM_SETREDRAW, true, 0);
dataGridView1.Refresh();

双方向のデータ バインディングまたは BindingSource によって提供される一部の機能 (フィルター処理など) が必要ない場合は、DataGridView.Rows.AddRange()メソッドを使用して一度に行を追加することを検討してください。

サンプルを含むソース記事へのリンク: http://10tec.com/articles/why-datagridview-slow.aspx

于 2016-03-14T09:58:00.113 に答える
3

DataGridView の仮想モードに必要なメソッドをオーバーライドしたくない場合は、Listview の使用を検討できる別の方法があります。

http://www.codeproject.com/Articles/16009/A-Much-Easier-to-Use-ListView

  • 0.1 秒未満で 100,000 個のオブジェクトのリストを作成できるバージョン (FastObjectListView) があります。
  • データ バインディングをサポートするバージョン (DataListView) と、大規模な (100,000 以上) データ セットのデータ バインディングをサポートする別のバージョン (FastDataListView) があります。
于 2012-07-31T12:43:48.983 に答える
2

ユーザーが 10000 個のアイテムをロードしたり並べ替えたりすると、パフォーマンスに問題がありました。行にコメントしたとき:

this.dataEvents.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;

すべてがうまくなりました。

于 2018-03-27T13:33:53.537 に答える
0

データ グリッドを仮想モードで使用することを検討する必要があると思います。基本的に、グリッドの範囲を前もって設定し、必要に応じて「OnCellValueNeeded」をオーバーライドします。

(特に 1000 程度の行のみ) グリッドの人口が効果的に瞬時になることがわかるはずです。

幸運を、

于 2012-04-21T16:11:49.710 に答える