2009-04-13 99 views
5

我正在使用PropertyGrid來顯示來自我的對象的屬性。不過,我還允許用戶創建自己的屬性,併爲這些自定義屬性設置值。每個可以具有這些自定義屬性的對象都有一個Dictionary集合,其中字符串是標識屬性的唯一鍵,而Object是基元類型的值(字符串,布爾值,int等)。重置屬性網格中的屬性

I'我們使用get和set方法創建了一個自定義PropertyDescriptor,這些方法用於檢查字典是否有匹配鍵,或者分別使用匹配鍵創建/覆​​蓋值。

但是,我也想給用戶清除屬性的能力,從而完全從字典中刪除它的條目。我將代碼放在我的自定義PropertyDescriptor的ResetValue重寫方法中,但是我沒有看到通過PropertyGrid接口調用此方法的任何方法?它似乎不是一個上下文菜單選項或類似的東西。

所以,如果我有一個自定義的PropertyDescriptor與自定義的ResetValue方法,我怎麼實際從PropertyGrid喚起該方法?

回答

3

我認爲實現這一目標的最簡單的方法是將一個文本菜單添加到您的屬性網格,與菜單項「復位」,然後再處理它的Click事件是這樣的:

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 – 2009-04-13 18:33:50

+0

是的,對propGri.SelectedGridItem.Select()的調用似乎是清除一些更新問題。 – 2009-04-13 18:42:46

1

註釋: PropertyGrid.SelectedObject在Childobjects中返回錯誤的值(組件)。 因此,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(); 
}