2009-04-13 9 views
5

Sto usando un PropertyGrid per mostrare le proprietà dai miei oggetti. Tuttavia, sto anche consentendo all'utente di creare le proprie proprietà e impostare valori per queste proprietà personalizzate. Ogni oggetto che può avere queste proprietà personalizzate ha una collezione di dizionari, dove la stringa è una chiave univoca per identificare la proprietà e Object è il valore di un tipo primitivo (stringa, bool, int ecc.)Ripristino delle proprietà da una griglia di proprietà

I ' Ho creato un PropertyDescriptor personalizzato con i metodi get e set che controllano il dizionario per una chiave corrispondente, oppure creano/sovrascrivono il valore con una chiave corrispondente rispettivamente.

Tuttavia, voglio anche dare all'utente la possibilità di cancellare la proprietà e quindi rimuovere completamente la sua voce dal dizionario. Metterei il codice a questo nel metodo di override ResetValue del mio PropertyDescriptor personalizzato, tuttavia non vedo alcun modo attraverso l'interfaccia PropertyGrid per richiamare questo? Non sembra essere un'opzione del menu contestuale o qualcosa di ovvio come quello.

Quindi, se ho un PropertyDescriptor personalizzato con un metodo ResetValue personalizzato, come faccio ad evocare il metodo da un PropertyGrid?

risposta

3

Penso che il modo più semplice per raggiungere questo obiettivo è quello di aggiungere un menu contestuale alla griglia delle proprietà, con una voce di menu "Reset", e quindi la gestione l'evento click in questo modo:

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

penso Visual Studio fa qualcosa di simile.

+0

Ahh sì ho appena trovato così questo post su MSDN. Sembra che sia l'opzione migliore. http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/9dd7b9bf-4134-4105-aba8-65002fed04f2 –

+0

Sì, la chiamata a propGri.SelectedGridItem.Select() sembra come se fosse chiarire anche alcuni problemi di aggiornamento. –

1

Annotazione: Il PropertyGrid.SelectedObject restituisce il valore errato (componente) in Childobjects. Di conseguenza, il metodo CanResetValue ha restituito un componente errato.

mia soluzione:

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(); 
}