プロパティグリッドからプロパティをリセット
-
09-09-2019 - |
質問
私は、オブジェクトのプロパティを表示するためにPropertyGridのを使用しています。しかし、私はまた、ユーザーが独自のプロパティを作成し、これらのカスタムプロパティの値を設定することが可能です。これらのカスタムプロパティを持つことができます。各オブジェクトは、文字列プロパティを識別するための固有のキーである辞書のコレクションを持っている、そしてオブジェクトがプリミティブ型の値(文字列、ブール値、などをint型...)
私は、一致するキーのための辞書をチェックするgetおよびsetメソッドでカスタムのPropertyDescriptorを作成した、またはそれぞれ一致するキーと値を上書きする/作成します。
しかし、私はまた、ユーザープロパティをクリアするため、完全に辞書からそのエントリを削除する機能を提供したいです。私は私のカスタムのPropertyDescriptorのResetValueオーバーライドメソッドでこれににコードを置くところ、しかし、私はこれをenvokeするPropertyGridのインタフェースを介してどのような方法が表示されませんか?コンテキストメニューのオプションまたはそのような明白なものではないようです。
私はカスタムResetValueメソッドを持つカスタムのPropertyDescriptorを持っている場合、どのように私は実際にPropertyGridのからその方法を呼び起こすんので、?
解決
私はこれを達成するための最も簡単な方法は、あなたの財産グリッドにコンテキストメニューを追加するメニュー項目に「リセット」することだと思うし、このようにそのクリックイベントを処理します:
private void resetToolStripMenuItem_Click(object sender, EventArgs e)
{
PropertyDescriptor pd = propGrid.SelectedGridItem.PropertyDescriptor;
pd.ResetValue(propGrid.SelectedObject);
}
私は、Visual Studioは、このような何かを考えてます。
他のヒント
注釈: PropertyGrid.SelectedObjectはChildobjectsに誤った値(成分)を返します。 したがって法CanResetValueが不正コンポーネントをrecived。
私の解決策ます:
private void OnContextMenuOpening(object sender, CancelEventArgs e)
{
var lGrid = mCurrentControl as PropertyGrid;
if (lGrid != null)
{
var lItem = lGrid.SelectedGridItem;
// Für untergeordnete Eigenschaften kann nicht SelectedObject verwendet werden
// Component ist eine interne Eigenschaft der Klasse System.Windows.Forms.PropertyGridInternal.GridEntry
// ((System.Windows.Forms.PropertyGridInternal.GridEntry)(lItem)).Component
// Zugriff via Reflection
var lComponent = lItem.GetType().GetProperty("Component").GetValue(lItem, null);
if (lComponent != null)
tsmi_Reset.Enabled = lItem.PropertyDescriptor.CanResetValue(lComponent);
else
tsmi_Reset.Enabled = lItem.PropertyDescriptor.CanResetValue(lGrid.SelectedObject);
}
}
// Contextmenu -> Reset
private void OnResetProperty(object sender, EventArgs e)
{
var lGrid = mCurrentControl as PropertyGrid;
if (lGrid != null)
lGrid.ResetSelectedProperty();
}
は、子供のためにInstance
クラスの非パブリック子孫のGridItem
プロパティに隠されているプロパティを含むオブジェクトへの参照をオブジェクト。ありがたいことに、このプロパティは、これらの子孫クラスが実装んITypeDescriptorContext
インターフェイスのメンバーです。だから、すべてのプロパティのコンテキストメニューにリセットコマンドを有効にする正しい含ま解決策があります:
private void contextMenuToolStrip_Opening(object sender, CancelEventArgs e)
{
var item = propertyGrid.SelectedGridItem;
resetToolStripMenuItem.Enabled = item != null &&
item.GridItemType == GridItemType.Property &&
item is ITypeDescriptorContext context &&
item.PropertyDescriptor.CanResetValue(context.Instance);
}
private void resetToolStripMenuItem_Click(object sender, EventArgs e)
{
propertyGrid.ResetSelectedProperty();
}