Pregunta

Estoy usando un PropertyGrid en una aplicación de herramienta para mostrar una ventana para monitorear un objeto en una aplicación remota. Cada segundo más o menos recibo una actualización de la aplicación con el estado de los miembros que han cambiado, y actualizo la cuadrícula. Llamo a Actualizar () para hacer que los cambios tomen. Todo esto funciona bastante bien, excepto una cosa.

Digamos que el objeto es demasiado alto para caber en la cuadrícula, por lo que hay una barra de desplazamiento. El usuario ha seleccionado un elemento de cuadrícula pero también se ha desplazado hacia arriba para que el elemento seleccionado esté debajo de la parte inferior del control.

El problema es que en Actualizar () el control desplaza automáticamente el elemento de la cuadrícula a la vista (curiosamente no hace esto cuando el elemento está por encima de la parte superior del control).

Estoy buscando una manera de evitar esto o para guardar el estado, haga la actualización () y luego vuelva a configurarlo. Intenté obtener el VScrollBar subyacente en PropertyGridView dentro de PropertyGrid, y jugar con " Value " ;, pero no permanece establecido permanentemente. Siempre vuelve a aparecer para que el elemento esté a la vista.

Anular la selección del elemento durante el desplazamiento es mi alternativa (el desplazamiento automático hacia la vista no ocurre sin ningún elemento de cuadrícula seleccionado) pero daña un poco la usabilidad, así que estoy buscando otra forma.

¿Alguien se encuentra con algo similar?

¿Fue útil?

Solución

Esto no es posible en MS PropertyGrid. Este componente tiene demasiados componentes internos inaccesibles para darle la flexibilidad que está solicitando y, como se dio cuenta, no es coherente (tiene el problema de una propiedad debajo de la cuadrícula pero no cuando está arriba). Es por eso que creé Smart PropertyGrid.Net . Si un producto comercial es una opción para usted, esta cuadrícula tiene la opción de almacenar estados de propiedad y restaurarlos después de realizar una acción en la cuadrícula (como Actualizar ()) sin ningún parpadeo.

Otros consejos

He encontrado un truco interesante:

puede seleccionar manualmente los elementos de la cuadrícula que cambió y se actualizarán :)

var panProp = categ.GridItems[3];
var tiltProp = categ.GridItems[4];
panProp.Select();
tiltProp.Select();

Entonces selecciono los elementos que necesito y luego muevo la selección hacia atrás

Para mí, lo siguiente marcó la diferencia:

no asigne un nuevo objeto.

Simplemente actualice los campos del objeto antiguo con los datos nuevos.

Ahora, al actualizar, mi PropertyGrid ya no se desplaza y también muestra contenido actualizado.

public void SoftRefreshPropertyGrid()
{
     var peMain = propertyGrid.GetType().GetField("peMain", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(propertyGrid)as  System.Windows.Forms.GridItem;
     if (peMain != null)
     {
           var refreshMethod = peMain.GetType().GetMethod("Refresh");
           if (refreshMethod != null)
           {
                  refreshMethod.Invoke(peMain, null);
                  propertyGrid.Invalidate(true);
           }
     }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top