• 締切済み

DataGridViewのスクロールでメモリリークする?

はじめまして Microsoft Visual C# 2005の初心者です。 WinXP上で、データグリッドビューを使用して、表示専用の5列10000行程度の表を作成しています。 データグリッドビューへのデータ設定は、データバインドは行わずに、直接 dgvDiffList_dataGridView1[2, 0].Value = "ABC"; のように行っています。 データグリッドビューの表示後、マウスホイールでスクロールさせて全データを表示しようとすると、スクロールを行う毎にメモリ使用量がどんどん増加していきます。 5000行目辺りの表示を行うころから80Mバイト位を使用してしまい、スクロールバーは動くものの、画面の表示更新が行われなくなり、それでもスクロールバーを動かしていると、OutOfMemoryExceptionが発生してしまいます。 データグリッドビューをバーチャルモードで実行しても、同様の現象になります。 データグリッドビューで大量の表示をした上でスクロールを行うと、メモリを消費してしまうものでしょうか。 また、それを回避する方法はなにかないでしょうか。

みんなの回答

回答No.1

>データグリッドビューで大量の表示をした上でスクロールを行うと、メモリを消費してしまうものでしょうか。 その通り。 >データグリッドビューをバーチャルモードで実行しても、同様の現象になります。 データグリッドビューを仮想モードで実行する場合は「データを実際に画面に表示しなければならなくなった時に、表示に必要な部分だけをデータグリッドにセットし、スクロールして消えた部分はコミットしてデータグリッドから消す」と言う手法を用います。 もし「最初に5×10000のデータをグリッドにセット済み」だと、仮想モードにする意味がありません。 http://msdn.microsoft.com/ja-jp/library/ms171624.aspx に「仮想モードにおいて、必要な時に必要最低限のデータをグリッドにセットし、画面から消えて不要になったデータをグリッドからコミットする方法」が載っているので、これを参考にして下さい。 簡単に言うと「見えてる部分だけデータをセットし、見えなくなった部分はデータを消す」と言う事です。 フォントを小さくしてセルの高さを縮め、表示行数を目一杯に増やしても、1度に画面に表示出来るのは、せいぜい50行くらいでしょう。 つまり「データグリッドには、画面に見えてる5列50行の250個のデータだけセットしておけば良い」って事です。 見えなくなって不要になったデータを消さずに放置しておけば、5000行分の不要なデータがメモリを食い尽くすのは当たり前です。

_MASARU_
質問者

お礼

ありがとうございました。 データグリッドビューをスクロールすると、メモリ消費量がどんどん増える件は、.NET Frameworkのバージョンによって発生したり、しなかったりするようです。 具体的には、.NET Framework 1.0、3.5では発生せず、.NET Framework 2.0で発生しています。 とりあえず、2.0の環境では使用しないように検討します。 でも、「2.0だから現象が発生するのか」と言うのをネットで探してみましたが、見つけられませんでした。

_MASARU_
質問者

補足

ご回答、ありがとうございます。 ご指摘の方法を検討(勉強)してみます。 現行の方法の場合、5×10000のグリッドを作成し、全てのセルにデータをセットして1ページ目(18行)を表示した時点では、メモリ消費量が20M以内なのですが、スクロールして行くと、どんどんメモリの消費量が増えていきます。 こちらも、見えていないところにデータをセットしたままであるがための現象なのでしょうか。

すると、全ての回答が全文表示されます。

関連するQ&A