2 つの画面のうちの 1 つで DataGridView の再描画パフォーマンスがひどい 質問する

2 つの画面のうちの 1 つで DataGridView の再描画パフォーマンスがひどい 質問する

私は実際にこれを解決しましたが、後世のために投稿します。

デュアルモニターシステムの DataGridView で非常に奇妙な問題が発生しました。この問題は、コントロールの再描画が非常に遅いという形で現れます (完全な塗り直しには30秒ほどかかります) ですが、これは片方の画面に表示されているときだけです。もう一方の画面に表示されているときは、再描画の速度は問題ありません。

私は最新の非ベータ版ドライバ (175 とか) を搭載した Nvidia 8800 GT を持っています。これはドライバのバグでしょうか? この特定の構成で我慢しなければならないので、それは未定です。(ただし、ATI カードでは発生しません...)

ペイント速度はセルの内容とは関係なく、カスタム描画では、単色の四角形をペイントする場合でも、パフォーマンスはまったく向上しません。

後で、フォームに ElementHost (System.Windows.Forms.Integration 名前空間から) を配置すると問題が解決することがわかりました。これは変更する必要はありません。DataGridView が配置されているフォームの子であるだけで済みます。見えるプロパティは true です。

アプリケーションに .NET 3/3.5 の依存関係を明示的に追加したくありません。リフレクションを使用して実行時にこのコントロールを作成するメソッドを作成します (可能な場合)。これは機能し、少なくとも必要なライブラリがないマシンでは正常に失敗します。つまり、再び低速になります。

この方法では、アプリの実行中に修正を適用することもできるため、WPF ライブラリがフォーム上で何を変更しているかを簡単に確認できます (Spy++ を使用)。

何度も試行錯誤した結果、コントロール自体 (フォームだけではなく) でダブル バッファリングを有効にすると問題が解決することに気付きました。


したがって、DoubleBuffering を有効にするには、DataGridView に基づいてカスタム クラスを作成する必要があります。これで完了です。

class CustomDataGridView: DataGridView
{
    public CustomDataGridView()
    {
        DoubleBuffered = true;
    }
}

グリッドのすべてのインスタンスがこのカスタム バージョンを使用している限り、すべて問題ありません。このためにサブクラス ソリューションを使用できない状況に遭遇した場合 (コードがない場合)、そのコントロールをフォームに挿入してみることができると思います :) (ただし、依存関係を回避するために、リフレクションを使用して外部からDoubleBufferedプロパティを強制的にオンにしようとする可能性が高くなります。)。

こんな些細なことにこんなに多くの時間を費やしてしまったのは悲しいことです...

ベストアンサー1

DoubleBuffering を有効にするには、DataGridView に基づいてカスタム クラスを作成するだけです。これで完了です。


class CustomDataGridView: DataGridView
{
    public CustomDataGridView()
    {
        DoubleBuffered = true;
    } 
}

グリッドのすべてのインスタンスがこのカスタム バージョンを使用している限り、すべて問題ありません。これが原因でサブクラス ソリューションを使用できない状況に遭遇した場合 (コードがない場合)、そのコントロールをフォームに挿入してみることができると思います :) (ただし、依存関係を回避するために、リフレクションを使用して DoubleBuffered プロパティを外部から強制的にオンにしようとする可能性が高くなります)。

こんな些細なことにこんなに多くの時間を費やしてしまったのは悲しいことです...

注: 回答を回答にすることで、質問が回答済みとしてマークされるようになります

おすすめ記事