2011-11-05 25 views
10

データテーブルからデータグリッドビューを作成しています。c#データグリッドビューの作成に非常に時間がかかる

列と行を移入する際に同時にフォーマットすると、データグラムビューの読み込みが非常に遅くなります。この問題は回避できますか?

+0

あなたはフォーマットのコード例を持っています。グリッドにいくつのデータを読み込んでいますか?ページデータソースを使用していますか、またはグリッドに何かをロードしていますか? – Ivo

+0

DatagridViewの入力に使用するコードを投稿できますか? datagridViewをデータテーブルにバインドしていますか、またはデータテーブルを繰り返し処理して、そのレコードをDatagridViewに挿入しますか? – aleroot

答えて

3

データグリッドビューを使用してデータを表示するときは、結果セットを制限し、ユーザーが実際に表示したときにのみレコードを表示するような戦略をとる必要があります。これはいつか仮想モード、またはデータページングと呼ばれます。 example of this strategy for wpfがありますが、winformsにも何かがあります。この質問も見てください:Winform DataGridview incredibly slow compared to MS Access Grid私はあなたの問題にも関係していると思います。

+0

合意すると、誰かがデータグリッドの遅さについて語るとき、それはたいていわずか10行を表示するために読み込まれている何千もの行についてです。ページ設定されたデータを読んでいることを確認してください。 (別名:データページング) – detay

+1

@detay高速グリッドを持つ魔法は、あなたがそれをどれだけ速く埋めるのではなく、それを埋めるのではありません:D –

4

DataGridView - AutoSizeColumnsModeのプロパティを確認できます。 モードをAllCellsからDisplayedCellsに変更すると、パフォーマンスが異なります。 これがあなたを助けてくれることを願っています。

10

AutoSizeColumnsModeと同様に、個々の列のAutoSizeModeプロパティもすべてのセル以外に設定されていることを確認してください。

また、私は1-2k行をロードするために約2〜4分を取っていたことが必要

SendMessage(dg.Handle, WM_SETREDRAW, false, 0); // before 

// updates to datagridview here... 

SendMessage(dg.Handle, WM_SETREDRAW, true, 0); // after 
+1

AutoSizeColumnsModeをNoneに変更してからデータソースをリフレッシュしてから、データソースは、私のロード時間を数分から1秒未満に短縮しました。 – KevenDenen

6

を使用することを発見しました。私はauto-resizeプロパティを変更しましたが、今はおそらく10-20になります。すべての列が確実に得られるように、行の作成ループの前にこれを実行しました。

foreach (DataGridViewColumn c in thisGrid.Columns) 
{ 
    c.AutoSizeMode = DataGridViewAutoSizeColumnMode.None; 
} 
2

愚か古いCHAPのルール: - inefficicient であることがよく知られている、データテーブルを避ける - 行の事前割り当ての使用を避ける[ "グリッド" .Rowcount + "グリッド" .AddRange()+ .. ](「グリッド」ADD()より5倍遅い) - DataGridViewが「あなたの画面」にバインドされていると考えてください。少数のデータ画面でITを読み込みます。 - 私はこれらの単純な事実を適用し、15秒で159列の420 000行の「ばかげたファイル」を「読み込む」ことができます。 (〜200 MB)。

0

私はDataGridViewのかなり良いパフォーマンスを持っています。数百行の追加には約200msかかります。ここでは私が何をするのですか:

virtual = true - 仮想化データグリッドビューは、全体のプロセスを高速化するようです。 logViewGrid_CellValueNeededを正しく実装することを忘れないでください。

また、バインドされたリストにデータを追加するときにレイアウトイベントを一時的に無効にすることもできます。やろう:

logViewGrid.SuspendLayout(); 
// add data, perform some operations on grid view 
logViewGrid.ResumeLayout(false); 

は、私はまた、を着色遅い行に問題がありました。それはこのように、個別に各セルのスタイルを設定して行うための私の方法:

gridViewInstance.Rows[currentRow].Cells[cellIndex].Style.BackColor = val; 

はその代わり、私がのために行ってきました:

30列のために、私はその部分の大幅な高速化を与え、
gridViewInstance.Rows[currentRow].DefaultCellStyle.BackColor = val; 

コードの

0

プログラムでいくつかのテストを行いました。ここでは、6つの列で5000行をロードし、各セルに行番号がロードされてデータが格納されています。私はストップウォッチを使って各アプローチをテストしました。私はdataviewgridをロードし、無効にしてロードし、有効にして隠し、ロードして表示し、suspendlayoutとresumelayoutを表示しました。私はそれを隠して読み込み、それを表示することが私のテストでははるかに速いことを発見しました。 .91秒だけロードする .91秒をsuspendLayout、load、resumeLayout .25秒にするとグリッドを無効にし、ロードして再び有効にして、グリッドを非表示、ロード、および表示するには、0.135秒。

私はあなたが必要としないものを読み込まないようにすべきだと考えていますが、このテストが役に立ちそうです。これにより

6

は、JavaのJTableに高速のDataGridViewになります:)

public static class ExtensionMethods 
{ 
    public static void DoubleBuffered(this DataGridView dgv, bool setting) 
    { 
     Type dgvType = dgv.GetType(); 
     PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", 
      BindingFlags.Instance | BindingFlags.NonPublic); 
     pi.SetValue(dgv, setting, null); 
    } 
} 

ExtensionMethods.DoubleBuffered(dataGridView1, true); 
関連する問題