DataGridViewが遅い・部分的に更新したい個人的メモ。現在帰宅してから個人的に使用するファイル整理ソフト作成中&使用中(要は行き当たりばったりで開発)に行き当たった事象と調べた内容に対する対応策。この手の事ってアプリを作り始めの時しか気にしないことがほとんどなので毎回調べる事になるんだよね...[環境]アプリはSSD上で実行。開発はvmware-ESXi上のWindows10/VisualStudioCommunity2015をリモートデスクトップ経由。[事象]10列10万行ほどあるdatagridviewの表示・スクロールなどいろいろ遅い[対応]下記の組み合わせ。コレでチェックボックス付き10列10万行が読み込み一瞬(こっちは主にSSDのおかげ)、スクロールも快適。実際に対応した順は4→1→3→2の順。1.Virtual=truedatagridviewにbindしたdatasourceへの値取得が表示時に都度取得されるようになる。そのままだと当然スクロール時に遅くなる。2.DoubleBuffered=trueデフォルトの状態だとdatagridの描画が値取得の度に更新される。trueの場合、描画範囲の値を取得し終わってから画面が更新される。virtual=trueに寄り値の取得が都度行われる+描画も値取得の都度行われるため、DoubleBufferd=trueにすることにより描画を値取得後一度のみにする。リモートデスクトップ経由で操作する場合、trueじゃない方が的な話も海外の掲示版に記述が見られる。テストで数十~数百いじる分には気にする必要なし。そもそも外部公開されてないプロパティなので変更することによる不都合に気がつかなくなるリスクの方が大きい。このプロパティはprotectedなので外部から無理矢理たたく。});3.datagridにbindするソースをList<Object>にするVirtual=trueで値の取得が描画時になるため、よく使われる(中身が複雑怪奇な)datatable/datarowは都合がよろしくない。処理量を削るため、シンプルにする。4.AutoGenerateColumns=false/AutoSizeColumnsMode=None/AutoSizeRowsMode=None全部無効。この手のauto物は何かする度に評価されるのでこれらが有効だと劇的に遅くなる。[やりたいこと]行の値更新時、その内容をピンポイントで反映する。いちいち読み込み直しだとスクロールバーの位置制御がめんどくさすぎる[対応]BindingSourceを間に挟む。例)一覧の設定BindingSourceはクラス変数として定義。値の更新はBindingSouceに対し指示する。このとき何番目のという内容が必要なのでいきなり行に紐付いた実際に使用するオブジェクトではなく、行番号を持っているDataGridViewRowを取得しておく。(Atom)著者:su以前は↓な感じの絵を勝手気ままに書いていた元同人屋。