3

ツール アプリで PropertyGrid を使用して、リモート アプリでオブジェクトを監視するためのウィンドウを表示しています。約 1 秒ごとに、変更されたメンバーの状態をアプリから更新し、グリッドを更新します。Refresh() を呼び出して、変更を反映させます。これは、1 つのことを除いてすべてうまく機能します。

オブジェクトが高すぎてグリッドに収まらないため、スクロールバーがあるとします。ユーザーはグリッド項目を選択しましたが、その上にスクロールしたため、選択した項目がコントロールの下部に表示されました。

問題は、Refresh() で、コントロールが自動的にグリッド アイテムを表示するようにスクロールすることです (奇妙なことに、アイテムがコントロールの上部にある場合、これは行われません)。

これを防ぐか、状態を保存し、Refresh() を実行してから元に戻す方法を探しています。PropertyGrid 内の PropertyGridView で基になる VScrollBar を取得し、「値」をいじってみましたが、永続的に設定されたままにはなりません。アイテムが表示されるように、常にポップ バックします。

スクロール中にアイテムの選択を解除することは私のフォールバックです (グリッドアイテムが選択されていない場合、ビューへの自動スクロールは発生しません) が、使いやすさが少し損なわれるため、別の方法を探しています。

似たようなことに出くわした人はいますか?

4

4 に答える 4

3

これは、MS PropertyGrid では不可能です。このコンポーネントにはアクセスできない内部要素が多すぎて、要求している柔軟性を提供できず、一貫性がないことに気付きました (グリッドの下のプロパティには問題がありますが、上にある場合は問題ありません)。そのため、Smart PropertyGrid.Netを作成しました。商用製品がオプションである場合、このグリッドには、プロパティの状態を保存し、グリッドでアクション (Refresh() など) を行った後にフリッカーなしでそれらを復元するオプションがあります。

于 2008-11-17T19:24:36.740 に答える
2

私は面白いハックを見つけました:

変更したグリッドアイテムを手動で選択すると、更新されます:)

var panProp = categ.GridItems[3];
var tiltProp = categ.GridItems[4];
panProp.Select();
tiltProp.Select();

だから私は必要なアイテムを選択し、選択を元に戻します

于 2012-08-17T11:23:11.180 に答える
1
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);
           }
     }
}
于 2016-06-26T12:23:45.197 に答える
1

私にとっては、次のことが違いを生みました:

新しいオブジェクトを割り当てないでください。

古いオブジェクトのフィールドを新しいデータで更新するだけです。

今、更新すると、私の PropertyGrid はスクロールしなくなり、更新されたコンテンツも表示されます。

于 2014-06-18T20:08:50.950 に答える