2009-04-13 26 views
5

Estoy usando una PropertyGrid para mostrar propiedades de mis objetos. Sin embargo, también estoy permitiendo que el usuario cree sus propias propiedades y establezca valores para estas propiedades personalizadas. Cada objeto que puede tener estas propiedades personalizadas tiene una colección de diccionario, donde la cadena es una clave única para identificar la propiedad, y Object es el valor de un tipo primitivo (cadena, bool, int, etc.)Restablecer propiedades de una cuadrícula de propiedad

I ' Hemos creado un PropertyDescriptor personalizado con los métodos get y set que verifican una clave coincidente para el diccionario, o bien creamos/sobreescribimos el valor con una clave correspondiente.

Sin embargo, también quiero dar al usuario la capacidad de borrar la propiedad, y así eliminar por completo su entrada del diccionario. Me gustaría poner el código a esto en el método de anulación ResetValue de mi PropertyDescriptor personalizado, sin embargo, no veo ningún camino a través de la interfaz PropertyGrid para invocar esto? No parece ser una opción de menú contextual o algo obvio así.

Entonces, si tengo un PropertyDescriptor personalizado con un método ResetValue personalizado, ¿cómo evoco ese método desde un PropertyGrid?

Respuesta

3

creo que la forma más fácil de lograr esto es agregar un menú contextual a la cuadrícula de propiedades, con un elemento de menú "Reset", y luego manejar el evento click de esta manera:

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

creo Visual Studio hace algo como esto

+0

Ahh sí, acabo de encontrar este post en MSDN también. Parece que esa es la mejor opción. http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/9dd7b9bf-4134-4105-aba8-65002fed04f2 –

+0

Sí, la llamada a propGri.SelectedGridItem.Select() parece que lo haría aclarar algunos problemas de actualización también. –

1

Anotación: El PropertyGrid.SelectedObject devuelve el Valor (componente) incorrecto en Childobjects. En consecuencia, el método CanResetValue recibió un componente incorrecto.

Mi Solución:

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