2009-04-13 17 views
5

J'utilise PropertyGrid pour afficher les propriétés de mes objets. Toutefois, je permets également à l'utilisateur de créer ses propres propriétés et de définir des valeurs pour ces propriétés personnalisées. Chaque objet qui peut avoir ces propriétés personnalisées a une collection Dictionary, où la chaîne est une clé unique pour identifier la propriété, et Object est la valeur d'un type primitif (string, bool, int etc.)Réinitialisation des propriétés d'une grille de propriétés

I ' Nous avons créé un PropertyDescriptor personnalisé avec des méthodes get et set qui vérifient le dictionnaire pour une clé correspondante, ou créent/écrasent la valeur avec une clé correspondante.

Cependant, je souhaite également donner à l'utilisateur la possibilité d'effacer la propriété, et ainsi supprimer complètement son entrée du dictionnaire. Je mettrais le code à ceci dans la méthode de remplacement ResetValue de mon PropertyDescriptor personnalisé, cependant je ne vois aucun moyen à travers l'interface PropertyGrid pour l'envier? Il ne semble pas être une option de menu contextuel ou quelque chose d'évident comme ça.

Donc, si j'ai un PropertyDescriptor personnalisé avec une méthode ResetValue personnalisée, comment puis-je réellement évoquer cette méthode à partir d'un PropertyGrid?

Répondre

3

Je pense que la meilleure façon d'y parvenir est d'ajouter un contextmenu à votre grille de propriété, avec un élément de menu « Reset », et la manipulation puis son événement click comme celui-ci:

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

Je pense que Visual Studio fait quelque chose comme ça.

+0

Ahh oui, je viens de trouver ce post sur MSDN ainsi. On dirait que c'est la meilleure option. http://social.msdn.microsoft.com/Forums/fr-FR/winforms/thread/9dd7b9bf-4134-4105-aba8-65002fed04f2 –

+0

Oui, l'appel à propGri.SelectedGridItem.Select() semble être le cas éclaircir certains problèmes de mise à jour aussi bien. –

1

Annotation: PropertyGrid.SelectedObject renvoie la valeur incorrecte (composant) dans Childobjects. Par conséquent, la méthode CanResetValue a renvoyé un composant incorrect.

Ma solution:

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