2012-09-16 15 views
9

Estoy usando la cuadrícula de propiedades en mi aplicación para mostrar el nombre y el valor de las propiedades de un objeto.¿Cómo puedo establecer el ancho de columna de una cuadrícula de propiedades?

De forma predeterminada, el ancho de las columnas (nombre y propiedad) está en una proporción de 50:50. y tenemos la opción de deslizar el divisor para cambiar este ancho. Me gustaría saber cómo se puede ajustar este ancho de forma programática para que se pueda establecer en digamos 25:75.

Respuesta

2

Como en this respuesta es mencionado:

no hay ninguna propiedad de hacer eso y hay que cortar el control. primero agregue este código:

public static void SetLabelColumnWidth(PropertyGrid grid, int width) 
{ 
    if (grid == null) 
     throw new ArgumentNullException("grid"); 

    // get the grid view 
    Control view = (Control)grid.GetType().GetField("gridView", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(grid); 

    // set label width 
    FieldInfo fi = view.GetType().GetField("labelWidth", BindingFlags.Instance | BindingFlags.NonPublic); 
    fi.SetValue(view, width); 

    // refresh 
    view.Invalidate(); 
} 

y llámelo con el tamaño que desee. de esta manera:

SetLabelColumnWidth(propertyGrid1, 100); 
+1

El nombre del campo "labelWidth" no existe. Aún así, el tamaño es 50:50! –

+1

Uso .Net 4.5 en mi proyecto y no hay ningún problema con el código. – hamed

+0

¿Cómo puedo cambiar el código de .Net 4? En .Net 4, ¡el código no puede cambiar el ancho de la columna! –

-3

puede utilizar en lugar de Smart PropertyGrid.Net PropertyGrid y cambiar la relación con este código:

propertyGrid1.LabelColumnWidthRatio = 0.25; 
+1

Por favor, adivinen para mí el componente gratuito! –

0

que he tenido éxito con la fuente abierto prolongado PropertyGrid se pueden encontrar en http://www.codeproject.com/Articles/13630/Add-Custom-Properties-to-a-PropertyGrid. Tiene dos métodos que le pueden interesar:

AutoSizeProperties - Mover automáticamente el divisor para ajustarse mejor a todos las propiedades que aparecen. MoveSplitterTo - Mueva el divisor como indica por el usuario en el parámetro.

Se podría calcular el 25% de la Width del PropertyGrid y establecer MoveSplitterTo con él.

uso actualmente AutoSizeProperties, ya que mueve automáticamente el divisor para ajustarse perfectamente a las etiquetas. Tenga en cuenta que debe configurar AutoSizeProperties después de configurar SelectedObject.

13

Encontré que la solución de hamed no funciona de manera confiable. Lo resolví simulando programáticamente al usuario arrastrando el divisor de columnas. El siguiente código utiliza la reflexión para hacer esto:

public static void SetLabelColumnWidth(PropertyGrid grid, int width) 
{ 
    if(grid == null) 
     return; 

    FieldInfo fi = grid.GetType().GetField("gridView", BindingFlags.Instance | BindingFlags.NonPublic); 
    if(fi == null) 
     return; 

    Control view = fi.GetValue(grid) as Control; 
    if(view == null) 
     return; 

    MethodInfo mi = view.GetType().GetMethod("MoveSplitterTo", BindingFlags.Instance | BindingFlags.NonPublic); 
    if(mi == null) 
     return; 
    mi.Invoke(view, new object[] { width }); 
} 
+0

Gracias funcionó para mí –

+0

Funciona, pero tiene que ser llamado después de que se creó el formulario (en el evento Form_Load o posterior). – NightElfik

+2

Esto funciona, pero debe invocarse cuando PropertyGrid ya está visible, no solo cargado. He vinculado este código al evento Resize, que se produce después de mostrar el control con un clic de botón. – ygoe

1

versión de Framework 4.0 (tuve que usar BaseType). El método se utiliza en la clase heredada de PropertyGrid:

private void SetLabelColumnWidth(int width) 
{ 
    FieldInfo fi = this.GetType().<strong>BaseType</strong>.GetField("gridView", BindingFlags.Instance | BindingFlags.NonPublic); 
    object view = fi.GetValue(this); 
    MethodInfo mi = view.GetType().GetMethod("MoveSplitterTo", BindingFlags.Instance | BindingFlags.NonPublic); 

    mi.Invoke(view, new object[] { width }); 
} 
Cuestiones relacionadas