PropertyGridで更新時にスクロールを防ぐ方法は?
-
08-07-2019 - |
質問
ツールアプリでPropertyGridを使用して、リモートアプリでオブジェクトを監視するウィンドウを表示しています。毎秒ごとに、変更されたメンバーの状態を含むアプリから更新を取得し、グリッドを更新します。 Refreshを呼び出して、変更を有効にします。これはすべて、1つのことを除いて非常にうまく機能します。
オブジェクトがグリッドに収まるには高すぎるため、スクロールバーがあるとしましょう。ユーザーはグリッドアイテムを選択しましたが、選択したアイテムがコントロールの下部の下にあるようにグリッドアイテムの上にもスクロールしました。
問題は、Refresh()でコントロールがグリッドアイテムを自動的にビューにスクロールすることです(奇妙なことに、アイテムがコントロールの上部にある場合、これは行われません)。
これを防ぐ方法、または状態を保存し、Refresh()を実行してから元に戻す方法を探しています。 PropertyGrid内のPropertyGridViewで基になるVScrollBarを取得し、「値」をいじってみましたが、永続的に設定されたままになりません。常にポップバックされるため、アイテムが表示されます。
スクロール中にアイテムの選択を解除するとフォールバックになります(グリッドアイテムが選択されていない場合、ビューへの自動スクロールは行われません)が、使いやすさが少し損なわれるため、別の方法を探しています。
誰でも似たような何かに遭遇しますか?
解決
これは、MS PropertyGridでは不可能です。このコンポーネントにはアクセスできない内部要素が多すぎるため、要求する柔軟性が得られず、気づいたように一貫性がありません(グリッドの下にあるが、上にある場合には問題がありません)。それが Smart PropertyGrid.Net を作成した理由です。商用製品がオプションの場合、このグリッドには、フリッカーなしでグリッドでアクション(Refresh()など)を実行した後にプロパティの状態を保存し、復元するオプションがあります。
他のヒント
興味深いハックを見つけました:
変更したグリッド項目を手動で選択すると、更新されます:)
var panProp = categ.GridItems[3];
var tiltProp = categ.GridItems[4];
panProp.Select();
tiltProp.Select();
必要なアイテムを選択し、選択を戻す
私にとっては、次のことが違いをもたらしました:
新しいオブジェクトを割り当てないでください。
単に、古いオブジェクトのフィールドを新しいデータで更新します。
今、更新すると、PropertyGridはスクロールしなくなり、更新されたコンテンツも表示されます。
public void SoftRefreshPropertyGrid()
{
var peMain = propertyGrid.GetType().GetField("peMain", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(propertyGrid)as System.Windows.Forms.GridItem;
if (peMain != null)
{
var refreshMethod = peMain.GetType().GetMethod("Refresh");
if (refreshMethod != null)
{
refreshMethod.Invoke(peMain, null);
propertyGrid.Invalidate(true);
}
}
}