2009-04-13 7 views
5

私はPropertyGridを使用してオブジェクトからプロパティを表示しています。しかし、ユーザーが独自のプロパティを作成し、これらのカスタムプロパティの値を設定することもできます。これらのカスタムプロパティを持つことができる各オブジェクトは、文字列がプロパティを識別する一意のキーである辞書コレクションと、Objectはプリミティブ型(文字列、bool、intなど)の値です。プロパティグリッドからのプロパティのリセット

I ' Dictionaryに一致するキーがあるかどうかをチェックするgetメソッドとsetメソッドを持つカスタムPropertyDescriptorを作成したか、一致するキーで値を作成/上書きします。

しかし、ユーザーにプロパティをクリアし、そのエントリを辞書から完全に削除することもできます。私はこのコードを私のカスタムPropertyDescriptorのResetValueオーバーライドメソッドに入れていましたが、これをエンボスするためにPropertyGridインターフェイスは表示されませんでしたか?コンテキストメニューのオプションやそのような明白なものではないようです。

カスタムResetValueメソッドを持つカスタムPropertyDescriptorがある場合、実際にそのメソッドをPropertyGridから呼び出すにはどうすればよいですか?

答えて

3

私はこれを達成するための最も簡単な方法は、メニュー項目の「リセット」で、あなたの財産グリッドにコンテキストメニューを追加し、次のようにそのクリックイベントを処理することであると思う:

private void resetToolStripMenuItem_Click(object sender, EventArgs e) 
{       
    PropertyDescriptor pd = propGrid.SelectedGridItem.PropertyDescriptor; 
    pd.ResetValue(propGrid.SelectedObject); 
} 

私は、Visual Studioを考えますこのようなことをする。

+0

ええああ、私はちょうど同様MSDNでこの記事を見つけました。それが最善の選択肢のようだ。 http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/9dd7b9bf-4134-4105-aba8-65002fed04f2 –

+0

ええ、propGri.SelectedGridItem.Select()の呼び出しは、いくつかのアップデートの問題も解決してください。 –

1

注釈: PropertyGrid.SelectedObjectは、Childオブジェクトの間違った値(コンポーネント)を返します。 したがって、メソッドCanResetValueは誤ったコンポーネントを受け取りました。

マイソリューション:

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(); 
} 
関連する問題