恐ろしい再描画性能のDataGridView私の二つの画面
-
02-07-2019 - |
質問
私は実際に解決されることが、私の投稿れています。
また、非常に奇数のDataGridView自分のデュアル-モニターシステム。のマニフェストとして非常にゆっくりとしたリペイントの制御のように30秒フルrepaintもすることができるものとし、一の画面があります。が、他の塗り替え速度に影響はありません。
私はNvidia8800GT最新の非ベータドライバー(175.something).でドライバのバグ?だが、空気中かに生きていること、特定の設定をします。(そうした事態が起こらないようにATIカードでつながったりもするのだけれど。)
塗装の速い細胞のコンテンツのカスタム描画な性能向上のために全てのものだけで塗り固矩形を塗りつぶします。
後かべることをElementHost(システムを装備。Windowsの場合です。ます。統合の名前空間の形補正の問題です。でなきゃ、それだけでする必要の子のDataGridViewます。でリサイズ(0,0)と 可視 物件はtrueです。
いを明示的に追加。純3/3.5依存性に私のアプリケーションこの方法を制御で実行ができる)を使用反射を生み出します。で、少なくとも失敗した場合に優雅に機械がないからなのに必要な図書館でも返されます。
この方法も適用できる固定のアプリが実行しやすいものとなっているコンポーネントのラインナップライブラリの変化も形成用スパイ++).
後に多くの試行錯誤しなが可能なダブルバッファリングのコントロールそのものではなくて、ほんの形補正を発行いたします!
うにする必要がありますが、すぐにカスタムクラスに基づDataGridViewできますのでできるものとDoubleBuffering.しようとしています。
class CustomDataGridView: DataGridView
{
public CustomDataGridView()
{
DoubleBuffered = true;
}
}
全てのインスタンスのグリッドはこのクラスのレーザ製品のビームがあります。ばい状況に陥によるこうを使用することはできませんサブクラスのソリューション(ばんのコードだと思う注入制御を形)(は私が使ってみ反射のDoubleBuffered物件の外部から再度の依存性).
このようなtriviallyに簡単なものを食べまでできるだけ多くの時間---
解決
あなただける必要があるカスタムクラスに基づDataGridViewできますのでできるものとDoubleBuffering.しようとしています。
class CustomDataGridView: DataGridView
{
public CustomDataGridView()
{
DoubleBuffered = true;
}
}
全てのインスタンスのグリッドはこのクラスのレーザ製品のビームがあります。ばい状況に陥によるこうを使用することはできませんサブクラスのソリューション(ばんのコードだと思う注入制御の形式は私が使ってみ反射のDoubleBuffered物件の外部から再度の依存関係).
このようなtriviallyに簡単なものを食べまでできるだけ多くの時間---
注意:の回答、回答の質問を行うことが可能で答え
他のヒント
ここでは一部のコードを設定する財産を用い反射なしの場合は、サブクラスとしてBenoitと理解することが可能である。
typeof(DataGridView).InvokeMember(
"DoubleBuffered",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,
null,
myDataGridViewObject,
new object[] { true });
人との検索方法なVB.NETこちらはコード:
DataGridView1.GetType.InvokeMember("DoubleBuffered", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.SetProperty, Nothing, DataGridView1, New Object() {True})
に加え、前職のためのWindows Formsおよびその利用のためのDataGridView成しています。このコードのクラスDrawingControlは以下となります。
DrawingControl.SetDoubleBuffered(control)
DrawingControl.SuspendDrawing(control)
DrawingControl.ResumeDrawing(control)
コDrawingControl.SetDoubleBuffered(制御)InitializeComponent()のコンストラクタです。
コDrawingControl.SuspendDrawing(制御される前に、必ずビッグデータの更新をした。
コDrawingControl.ResumeDrawing(control)というビッグデータの更新をした。
これらの最後の2行うのが最適とされていない最後にブロックです。(もより良い書き換えのクラスとして IDisposable
電話 SuspendDrawing()
のコンストラクタ ResumeDrawing()
に Dispose()
.)
using System.Runtime.InteropServices;
public static class DrawingControl
{
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);
private const int WM_SETREDRAW = 11;
/// <summary>
/// Some controls, such as the DataGridView, do not allow setting the DoubleBuffered property.
/// It is set as a protected property. This method is a work-around to allow setting it.
/// Call this in the constructor just after InitializeComponent().
/// </summary>
/// <param name="control">The Control on which to set DoubleBuffered to true.</param>
public static void SetDoubleBuffered(Control control)
{
// if not remote desktop session then enable double-buffering optimization
if (!System.Windows.Forms.SystemInformation.TerminalServerSession)
{
// set instance non-public property with name "DoubleBuffered" to true
typeof(Control).InvokeMember("DoubleBuffered",
System.Reflection.BindingFlags.SetProperty |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.NonPublic,
null,
control,
new object[] { true });
}
}
/// <summary>
/// Suspend drawing updates for the specified control. After the control has been updated
/// call DrawingControl.ResumeDrawing(Control control).
/// </summary>
/// <param name="control">The control to suspend draw updates on.</param>
public static void SuspendDrawing(Control control)
{
SendMessage(control.Handle, WM_SETREDRAW, false, 0);
}
/// <summary>
/// Resume drawing updates for the specified control.
/// </summary>
/// <param name="control">The control to resume draw updates on.</param>
public static void ResumeDrawing(Control control)
{
SendMessage(control.Handle, WM_SETREDRAW, true, 0);
control.Refresh();
}
}
その答えはここに勤めています。と思ったの追加を精密にするべきと考え標準の実践のために誰でも実施が求められていたのです。
のソリューションでは、どの場合を除き、UIが行われているクライアントとしてセッションのリモートデスクトップが可能なネットワークの帯域幅は低い。この場合、性能がさらに悪化の使用によりダブルバッファリング.そのためにもたらされたと考えられるこれ以下のとしてより完全な答え:
class CustomDataGridView: DataGridView
{
public CustomDataGridView()
{
// if not remote desktop session then enable double-buffering optimization
if (!System.Windows.Forms.SystemInformation.TerminalServerSession)
DoubleBuffered = true;
}
}
詳しくはをご参照 検出リモートデスクトップ接続
この解決の問題です。に行くトラブルシューティングのタブのプロパティの表示やチェックのハードウェア高速ライダーです。きっ新会社のPCからでも設定が一目盛りから全くなかった問題は印刷.私が最新のビデオカードドライバーとなっているため、塗装の開発を維持-管理を制御なったのがとても遅くなります。私はリセットでこの問題がすっかりなくなりました。
これはトリック作品のご使用を推奨させていただく。
るだけで追加したこの指摘を修正:楽しむにはストリップ通り沿いの新Nvidiaドライバーの解決の問題です。バーコードが書き換えられます。
のための完全性、最新号及びバックナンバー、Nvidia Quadro NVS290とドライバーの日付の月2008(v.169).へのアップグレードの最新インテル®182日付の月2009年大幅に向上し、塗料イベントのための制御、特にDataGridView.
この問題は見られなかった他のATIのカードが発展が生じる)
ベスト!:
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hWnd As Integer, ByVal wMsg As Integer, _
ByVal wParam As Integer, ByRef lParam As Object) _
As Integer
Const WM_SETREDRAW As Integer = &HB
Public Sub SuspendControl(this As Control)
SendMessage(this.Handle, WM_SETREDRAW, 0, 0)
End Sub
Public Sub ResumeControl(this As Control)
RedrawControl(this, True)
End Sub
Public Sub RedrawControl(this As Control, refresh As Boolean)
SendMessage(this.Handle, WM_SETREDRAW, 1, 0)
If refresh Then
this.Refresh()
End If
End Sub
私たちが経験してきた同様の問題。純3.0DataGridView、デュアル構成のモニタリングシステム。
当社のアプリケーションを表示グリッドとグレーの背景には、この細胞が変わりません。選択すると、"設定変更"ボタンを押すと、このプログラム変更の背景色の細胞白を表示し、ユーザーの細胞のテキストが変更されます。"をキャンセル"ボタンを押すと変化の背景色、上記の細胞に戻ります。
として背景の色を変更するとフリッカが必要な課題についての印象をデフォルトのサイズのグリッドと同じ行数と列あります。この問題が発生のモニター(第二次)では起こらないことになるシングルモニターシステム。
ダブルバッファリングの制御を使用し、上記の例では、解決問題です。心から感謝とお礼を申しおです。