miércoles, 24 de agosto de 2011

Refrescar un grid de busqueda al modicar en otra pantalla

    Normalmente utilizo la misma estructura es mis aplicaciones, primero pongo una pantalla de tipo búsqueda para que el usuario pueda localizar los datos y después desde allí se llama a otra para editar o para agregar un nuevo registro. Cuando el usuario ha grabado los datos en la pantalla de edición lo lógico es refrescar el grid que aparece en la pantalla de busqueda para que los datos que muestre sean correctos.
Para poder hacer esto hay que poner unas lineas de código en el evento "Saved" de la pantalla de edición que se ejecutará justo despues de guardar los datos. Suponiendo que la pantalla de busqueda se llama vendedorGrid y la tabla era vendedor, sería así (C#):

partial void vendedorMto_Saved()
{
     // Refrescarmos el grid de la pantalla padre si existe
     foreach (var parentScreen in Application.ActiveScreens.Where(a => a.Screen is vendedorGrid))
     {
         parentScreen.Screen.Details.Dispatcher.BeginInvoke(() =>((vendedorGrid)parentScreen.Screen).vendedor.Refresh());
     }
}

Básicamente lo que hace es buscar en las pantallas abiertas si existe alguna del tipo vendedorGrid y llama al evento Refresh de dicha pantalla. Imagino que en futuras versiones de LightSwitch se podrá hacer esto de una manera más sencilla sin código pero ahora mismo esta es la mejor solución.

3 comentarios:

  1. Y en VB como quedaria el codigo, Gracias

    ResponderEliminar
  2. Hola,

    Seria algo así:

    For Each parentScreen As var In Application.ActiveScreens.Where(Function(a) TypeOf a.Screen Is vendedorGrid)
    parentScreen.Screen.Details.Dispatcher.BeginInvoke(Function() DirectCast(parentScreen.Screen, vendedorGrid).vendedor.Refresh())
    Next

    ResponderEliminar
  3. Si necesitas traducir algo de C# a VB.NET puedes utilizar la siguiente web que lo hace fácilmente:

    http://www.developerfusion.com/tools/convert/csharp-to-vb/

    ResponderEliminar