Frage

Ich bin mit einem Property Eigenschaft aus meinen Objekten zu zeigen. Aber ich bin so dass der Benutzer auch ihre eigenen Eigenschaften erstellen, und legen Sie Werte für diese benutzerdefinierten Eigenschaften. Jedes Objekt, das diese benutzerdefinierten Eigenschaften hat eine Dictionary Sammlung haben kann, in der die Zeichenkette ein eindeutiger Schlüssel ist die Eigenschaft zu identifizieren und Objekt ist der Wert eines primitiven Typs (string, bool, int etc ..)

Ich habe eine benutzerdefinierte PropertyDescriptor mit Get- und Set-Methoden erstellt, die das Wörterbuch für einen passenden Schlüssel zu überprüfen, oder erstellen / überschreiben Sie den Wert mit einem passenden Schlüssel ist.

Allerdings mag ich auch dem Benutzer die Möglichkeit geben, das Eigentum zu löschen und damit den Eintrag ganz aus dem Wörterbuch zu entfernen. Ich würde den Code dazu in der Resetvalue Überschreibung Methode meines benutzerdefinierten PropertyDescriptor setzen, aber ich sehe keinen Weg durch den Property Schnittstelle dies envoke? Es scheint nicht, eine Kontextmenü-Option oder etwas offensichtlich so zu sein.

Also, wenn ich eine benutzerdefinierte PropertyDescriptor mit einer benutzerdefinierten Resetvalue-Methode habe, wie kann ich evozieren tatsächlich diese Methode aus einem Property?

War es hilfreich?

Lösung

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

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

Ich denke, Visual Studio tut so etwas.

Andere Tipps

Anmerkung: Die PropertyGrid.SelectedObject gibt den falschen Wert (Komponente) in Childobjects. Folglich recived 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();
}

Für Kind-Objekte, die Referenz auf das Objekt eine Eigenschaft enthält, in der Instance Eigenschaft der nicht-öffentlichen Nachkommen der GridItem Klasse verborgen ist. Zum Glück ist diese Eigenschaft ein Mitglied der ITypeDescriptorContext Schnittstelle, die diese abgeleiteten Klassen implementieren können. So gibt es eine Lösung, die Aktivierung des Reset-Befehl für alle Eigenschaften in einem Kontextmenü richtig beinhaltet:

private void contextMenuToolStrip_Opening(object sender, CancelEventArgs e)
{
  var item = propertyGrid.SelectedGridItem;
  resetToolStripMenuItem.Enabled = item != null &&
                                   item.GridItemType == GridItemType.Property &&
                                   item is ITypeDescriptorContext context &&
                                   item.PropertyDescriptor.CanResetValue(context.Instance);
}

private void resetToolStripMenuItem_Click(object sender, EventArgs e)
{
  propertyGrid.ResetSelectedProperty();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top