• 締切済み

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

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

みんなの回答

  • chie65535
  • ベストアンサー率43% (8525/19376)
回答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

  • DataGridViewに関して

    開発環境:Visual Basic2008 Express Ediotion DataGridViewに関して教えて下さい。 DataGridViewに表示されているデータの中で、何行目が選択されているか を取得したいと考えています。 動作手順としては、DataGridViewのデータが選択された状態で、選択ボタンを押した 際に、どのデータが選択されているかを取得したいと考えています。 恐らく可能かと思われますが、何行目だけでなく、行にある項目の全ての値も取得 したいと考えています。 どのように記述したら良いかを教えて下さい。 参考になるようなホームページ、もしくはコードを記述して頂ければ幸いです。 Visual Basic2008初心者なので、初歩的な質問で申し訳ありません。 よろしくお願いします。

  • DataGridView スクロール時の描画速度

    Visualbasic 2013 でWindows Form アプリを開発しております。 DataGridViewにOracleのテーブルより抽出した結果を 10,000レコードを表示する必要があります。 ※DataTableをバインドしてDataGridViewのDataSourceに指定しています。 表示自体は問題なく実装できているのですが、 スクロール時の描画が遅いため実運用では支障がでると考えられます。 スクロール時の描画速度を向上する施策として何か分る方が いらっしゃいましたらご教授頂けますと幸いです。 現時点では以下のような実装としております。 ・DoubleBufferedを有効にしております。 ・1レコードごとにデータ妥当性チェックを行っております。  ※DataTableの全行ループしチェックNGの場合セルの背景色を赤色にしています。

  • VB.NET DataGridView 縦スクロールバーを常に表示

    VB.netについてなのですが、 DataGridViewの縦スクロールバーを常に表示したいです。 データ数によってスクロールバーが表示されたり非表示になったりしていますが、常に表示することは可能でしょうか。教えてください。 環境: Visualstudio2005 windows XP よろしくお願いします。

  • DataGridViewに関して

    開発環境:Visual Basic 2008 あるデータをDataGridViewにて表示させていますが、その際に、データのグループ 単位でグリッド線をを太く、あるいは色を変化させる事ができないかと考えています。 DataGridView全体のグリッド線の色を変化させるような事は可能かと思われますが、 データを表示する過程で、規則性のない(グループ単位)で、行のグリッド線を変更する ような事は可能でしょうか? 教えて下さい。 よろしくお願いします。

  • visualbasic datagridview

    VisualBasic 2013 を利用してWindows Formアプリケーションを構築しております。 DataGridViewを配置してデータベースよりデータ抽出した結果を表示しております。 表示レコードが複数行存在する場合にはスクロールバーが表示されているのですが、スクロールバーの表示が小さいため以下のような方式で制御できないかと考えております。 ★実現したいこと  ボタン「↑」を配置しボタンクリックで上側へのスクロール制御  ボタン「↓」を配置しボタンクリックで下側へのスクロール制御 大変お手数お掛けいたしますがご存じの方がいらっしゃいましたらご教授のほどよろしくお願いいたします。 以上です。

  • datagridviewに表示されるデータの識別

    visual studio2010とaccessのデータ(MDB)を使用してプログラムを作っています。 フォームにdatagridviewを1つ配置し、ボタンを2つ用意します。 datagridviewにはデータをバインドせず、2つあるボタンそれぞれに表示するプログラムの記述をし、ボタンを押下することで表示させるようにしています。 ここからが不明な点なのですが、この2つあるデータを、datagridviewのダブルクリックによって別の登録画面を表示し、データの更新や削除をおこなったり、データの新規登録を行いたいのです。 が、2つあるデータを区別させるプログラムの記述がわかりません。 当方は勉強中の身なので、それが可能なのかすら正直わかりませんが、 可能であればプログラムでデータを識別させるコードを教えていただけないでしょうか。 ネットで調べたのですが似たようなものをまず見つけられず、よくわかりませんでした。 よろしくお願いいたします。

  • VB2005 Datagridview の仮想モードでメモリリーク

    VB2005にてDatagridviewの仮想モードを実装しています。 DataGridviewを全件ループ処理する場合にメモリが増加します。完了してもそのままメモリが減りません。これを回避する方法がありますか?CellValueNeededはメモリを消費し続けるものなのでしょうか。 実際のプログラムでは件数が多い場合にメモリの消費が止まらずメモリ不足に陥ります。 以下は単純なコードにしたサンプルです。これでもデバッグモードで動かすと起動時20Mくらいのメモリ消費がループ処理時に100Mくらいにに増えます。 ※実際の処理でバインドしているデータ(datatable等)の方をループさせるという代替案がありますが、今回はdatagridviewから行った結果のメモリ不足についてご教授いただければと思います。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With Me.DataGridView1 .Columns.Add("Column1", "列1") .Columns.Add("Column2", "列2") .Columns.Add("Column3", "列4") .Columns.Add("Column4", "列4") .Columns.Add("Column5", "列5") .Columns.Add("Column6", "列6") .Columns.Add("Column7", "列7") .VirtualMode = True .RowCount = 100000 End With End Sub Private Sub DataGridView1_CellValueNeeded(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DataGridViewCellValueEventArgs) _ Handles DataGridView1.CellValueNeeded e.Value = e.RowIndex.ToString & "," & e.ColumnIndex.ToString End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click For i As Integer = 0 To DataGridView1.Rows.Count - 1 DataGridView1.Rows(i).Cells(1).Value = DataGridView1.Rows(i).Cells(2).Value Next MsgBox("終了") End Sub

  • VB.NET DataGridViewについて

    VB.NET DataGridViewで表示した4行のデータを1つとして結合したいです。 ご存知の方、教えてください。 環境: Windows XP Visual Studio2005 VB.NET

  • VS2005 DataGridViewのスクロールについて

    VS2005で開発中です。 DataGridViewで、カラムを1つだけ指定します。 そのカラムには入力文字数がたくさん入るので、幅は1000としています。 画面上見えている文字数は半角で40文字程度です。 そこに40文字以上の文字数を入力した時、画面上で表示出来る40文字しか見えていません。 それを、入力した後、自動に横スクロールが右に移動して最後の文字から前を表示したいのですが、方法がよくわかりません。 AutoSizeColumnsModeをFILLにしたりしてみたのですが、その場合、最初に画面を開けたとき、横スクロールバーが出てきませんでした。 横スクロールバーは常に出ている状態にもしたいのです。 よろしくお願いします。

  • テーブルのスクロール(HTML)

    DBの内容をテーブルを使用して表示させました。 初期表示の時は20行ぴったり表示されるのですが、 マウスのホイールでスクロールすると一番上と一番下の行が切れてしまいます。 何回スクロールしても20行ずつ、データが切れることなく表示されるようにしたいのですが、 どうすればよいのでしょうか? アドバイスお願いします。

    • ベストアンサー
    • HTML