- 締切済み
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
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- todo36
- ベストアンサー率58% (728/1234)
> DataGridView1.Rows(i).Cells(1).Value = DataGridView1.Rows(i).Cells(2).Value セルごとの値を持たないのが仮想モード。 よって、セルの値を参照するのも設定するのもおかしいと思います。
補足
ご回答ありがとうございます。 仮想モードはおっしゃるとおりセルごとに値を持たない代わりに、参照されるとキャッシュ(参照先のdatatable等)から値を取得します。 強引な方法だということは承知の上です。メモリを増加の原因が知りたいので質問を投げています。 おっしゃりたいことは分かりますが、プログラム側から仮想モードのデータグリッドのセルを参照することについての議論は当方の質問内容とはそれるので申し訳ありませんがご遠慮ください。