2009-04-13 14 views
5

Ich verwende ein PropertyGrid, um Eigenschaften von meinen Objekten anzuzeigen. Ich erlaube dem Benutzer jedoch auch, eigene Eigenschaften zu erstellen und Werte für diese benutzerdefinierten Eigenschaften festzulegen. Jedes Objekt, das diese benutzerdefinierten Eigenschaften haben kann, verfügt über eine Dictionary-Auflistung, wobei die Zeichenfolge ein eindeutiger Schlüssel zur Identifizierung der Eigenschaft ist. Object ist der Wert eines primitiven Typs (Zeichenfolge, Bool, Int usw.).Zurücksetzen von Eigenschaften aus einem Eigenschaftenraster

I ' Ich habe einen benutzerdefinierten PropertyDescriptor mit Methoden get und set erstellt, die das Dictionary nach einem übereinstimmenden Schlüssel überprüfen oder den Wert mit einem übereinstimmenden Schlüssel erstellen bzw. überschreiben.

Ich möchte aber auch dem Benutzer die Möglichkeit geben, die Eigenschaft zu löschen und damit seinen Eintrag vollständig aus dem Wörterbuch zu entfernen. Ich würde den Code dazu in die ResetValue-Methode override von meinem benutzerdefinierten PropertyDescriptor einfügen, aber ich sehe keine Möglichkeit durch die PropertyGrid-Schnittstelle, dies zu erreichen? Es scheint keine Kontext-Menü-Option oder etwas so Offensichtliches zu sein.

Also, wenn ich einen benutzerdefinierten PropertyDescriptor mit einer benutzerdefinierten ResetValue-Methode habe, wie erwecke ich diese Methode tatsächlich von einem PropertyGrid?

Antwort

3

Ich denke, der einfachste Weg, dies zu erreichen, ist ein contextmenu, um Ihr Eigentum Gitter hinzufügen, mit einem Menüpunkt „Reset“, und dann wie folgt aus seinem Click-Event-Handling:

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

ich Visual Studio denken macht so etwas.

+0

Ahh ja ich diesen Beitrag gerade gefunden als auch auf MSDN. Scheint so, als ob das die beste Option wäre. http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/9dd7b9bf-4134-4105-aba8-65002fed04f2 –

+0

Ja, der Aufruf von propGri.SelectedGridItem.Select() scheint wie es würde bereinigen einige Update-Probleme. –

1

Anmerkung: Das PropertyGrid.SelectedObject gibt den falschen Wert (Komponente) in Childobjects zurück. Folglich erhielt die Methode CanResetValue eine falsche Komponente.

Meine Lösung:

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