DataGridViews でパフォーマンスの問題が発生し、再描画が恐ろしく遅くなり、派生型を作成してコントロールでダブル バッファリングを有効にする解決策が見つかりました。(DoubleBuffered プロパティが保護されているため、派生型が必要です)
DoubleBuffered プロパティを true に設定しても問題はないようです。
DataGridViews でパフォーマンスの問題が発生し、再描画が恐ろしく遅くなり、派生型を作成してコントロールでダブル バッファリングを有効にする解決策が見つかりました。(DoubleBuffered プロパティが保護されているため、派生型が必要です)
DoubleBuffered プロパティを true に設定しても問題はないようです。
私はその最善の解決策だと思います:
typeof(DataGridView).InvokeMember(
"DoubleBuffered",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,
null,
myDataGridViewObject,
new object[] { true });
ここで見つけた
DGV は Control からプロパティを継承するため、保護されます。Control.DoubleBuffered は保護されています。各派生コントロールは、それをオンにすることを決定する必要があるため、これは理にかなっています。また、コントロール ユーザーが任意にオンまたはオフにすることは意味がありません。DGV の設計者はオフを決定しました。
彼らがそれを決定した理由の 1 つは、ダブル バッファリングが実際に描画を遅くすることです。バッファー ビットマップをレンダリングするための追加の手順には、時間がかかります。人間の目には速く見えるだけで、ビットマップが突然表示されます。ビットマップへの描画にかかる時間はわかりません。他のコントロールをペイントする必要がなく、それらが DGV の後に順番を取得する場合を除き、それは非常に目立ちます。
表示されるのは、フォームが最初に描画され、コントロールが配置される穴が開いていることです。これらの穴の背景は白です。TransparencyKey または Opacity プロパティを使用する場合は黒。次に、各コントロールが Paint イベントを取得し、穴が 1 つずつ塗りつぶされます。この効果は、DoubleBuffered が解決するものとは異なる種類のちらつきですが、ユーザーにもちらつきとして認識されます。背景が黒の場合は特に目立ちます。
この問題を解決するには、すべてのコントロールを含むフォーム全体をダブル バッファリングする必要があります。これは、Windows フォームでは使用できません。ただし、Windows XP 以降では実際にこれをサポートしています。このスレッドをチェックして、それがどのように行われたかを確認してください。そのスレッドに記載されているように、副作用がある可能性があることに注意してください。
定義によるダブル バッファリングでは、コントロールのビューをレンダリングするために 2 つのバッファーと 2 倍のメモリが使用されます。したがって、そこにはいくつかの欠点がありますが、現在 PC に搭載されているメモリの量を考えると、犠牲に気付く人はあまりいないでしょう。
なぜ保護されているのかわかりません。この関数は、コントロールの初期バージョンでは使用できなかった可能性があります。この機能が導入されたとき、設計者はコントロールのパブリック インターフェイスを変更したくありませんでした。あるいは、彼らはそれを高度な機能と見なし、コントロールに不慣れな人がコントロールに何か役立つことをさせるために理解する必要があるメソッドの数を制限したかったのかもしれません.
datagridview で doublebufferingを有効にするために継承は必要ありません。既存のデータグリッドビューのリフレクションでそれを行うことができます。