うなまな Blog

VB覚え書き

AILight Banner
AILight Blog

プロフィール

うなまな Blog

目次

Blog 利用状況

記事分類

過去の記事

タグ

DataGridView仮想モードの雑感

件数が多いデータをDataGridVewにバインドした場合、表示時間・メモリ使用量など、
負荷が大きいので、仮想モード(VirtualMode)で行えば、これらを回避できる。
・・・がバインドした場合と違い、色々な動作を自分で実装しなくてはいけない。

CellValueNeeded,CellValuePushed,CellValuePushed,NewRowNeeded,RowDirtyStateNeeded,CancelRowEdit

上記のイベントで適宜処理を実装しないと駄目なので、ちょいと面倒。
表示だけなら、CellValueNeededイベントでセルに表示する値を設定すればいい。

Public Class Form1
    Private Sub Form1_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load
        With Me.DataGridView1
            .Columns.Add("Column1""列1")
            .Columns.Add("Column2""列2")
            .Columns.Add("Column3""列3")
            .VirtualMode = True
            .ReadOnly = True
            .AllowUserToAddRows = False
            .AllowUserToOrderColumns = False
            .RowCount = 10000 '<---この件数は対象レコード数
        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
End Class

実際には、CellValueNeededイベントでDBからある程度まとまったデータを読み込み(ページング)
、それを利用してセルに値を設定するんだけど、このイベントの発生タイミングが問題。
列数が少なければ問題ないんだろうけど(DBの問題かも)、数万件ある場合、スクロールバーを
スクロール(マウスでひこずる)した場合、すごい頻繁にイベントが発生する。

すなわち、DBを読み込む処理が頻繁に発生して、アプリが固まる(DBタイムアウト?)。
これは私の実装方法に問題があるんだろうけど、解決策が思い浮かばない。。。orz
スクロールバーのイベントを利用して、ScrollEventType.ThumbTrackの時だけは処理
しないとか・・・

もう少し悩んで見ることにします。

[参考]
http://www.windowsdevcenter.com/pub/a/windows/2005/12/20/just-in-time-data-loading-for-datagrids.html?page=1
http://msdn2.microsoft.com/ja-jp/library/ms171622(ja-jp,VS.80).aspx

投稿日時 : 2006年2月8日 11:40


コメントを追加

#  DataGridViewのScrollイベントって使えないのか? 2006年2月8日 22:09 うなまな Blog

DataGridViewのScrollイベントって使えないのか?

#  re: DataGridView仮想モードの雑感 2006年2月9日 12:32 菊池

自分の場合、スクロールバーでのイベントではタイマーを0.n秒とかでリセットする仕掛けるだけとかに
しておいて、スクロールイベントが落ち着いてタイマーが跳ねたらDBフェッチに行くようにしてますね。

DB -> キャッシュ をタイマーベース
キャッシュ -> DataGridView はイベントドリブン

こんな感じかな。

キャッシュの仕組みをちゃんと用意しないとDataGridViewからのイベントの嵐を捌くのはちょいきついです。

#  re: DataGridView仮想モードの雑感 2006年2月9日 22:16 うなまな

>DB -> キャッシュ をタイマーベース
>キャッシュ -> DataGridView はイベントドリブン

なるほど、やっぱりこのあたりの実装をちゃんとしておかない
と、大変な事になりますよね。

実際、デバッグ時には、固まったりして、格闘しております。
タイトル
名前
URL
コメント