質問

ツールアプリで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);
           }
     }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top