none
problema actualizacion datagridview c# - ayuda! RRS feed

  • Pregunta

  • mi problema es el siguiente, tengo un programa en mi computadora  que tiene un datagrid, donde una persona usando otro usuario en otra maquina hace modificaciones a su datagrid y esas modificaciones las debo tener "en tiempo real" reflejadas en mi datagrid (los datos estan enlazados a una bd), una opcion fue implementar un timer que corriera cada segundo y efectivamente funciona pero tiene un detalle, imaginemos que mi datagrid tiene 50 filas y estoy en la fila 40, si la otra persona hace una actualiacion, al momento de que se actualiza mi grid me regresa a las primeras filas SIEMPRE, al igual que si el timer funciona cada segundo nunca me va a dejar bajar a las otras filas por que cada segundo se estaria actualizando :(, alguna idea o sugerencia de como podria implementar una opcion mejor, les estare eternamente agradecido, saludos.

    trabajo con: visual studio 2008, sql server 2008, windows 7


    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.

    miércoles, 10 de octubre de 2012 17:12

Todas las respuestas

  • Pues necesitaríamos ver cómo trabaja el timer para determinar si hay una mejor manera o no.  Estoy imaginándome que usted tiene en este momento código que reemplaza totalmente los contenidos del DataGridView (supongo que es DataGridView porque el DataGrid es de WPF, no Windows Forms).  Si es así pues me parece lógico que el DGV se devuelva a la primera fila.

    Asumiendo que usted reemplaza los contenidos completos, le recomiendo cambiarse a un método que no haga esto.  Para ello es necesario como mínimo un capa de negocio.  Si usted está usando datasets directamente entonces debe empezar por cambiar eso.

    El databinding de Windows Forms puede aprovechar los eventos de las interfase INotifyPropertyChanged y IRaiseItemChangedEvent.  Lo mejor entonces es crear una clase que implemente INotifyPropertyChanged para representar un registro del DGV, y contener instancias de esta clase en un BindingList<>.

    Luego el timer haría la actualización del BindingList<> cada segundo, pero no reemplazando todos los elementos, sino más bien ubicando los elementos por ID y alterando sus propiedades individualmente.  De esta forma el DGV no tendrá la necesidad de eliminar sus celdas y recrearlas, sino que más bien podrá simplemente cambiar el valor de la celda o celdas que necesite.  Además será un proceso más eficiente.


    Jose R. MCP
    Code Samples

    miércoles, 10 de octubre de 2012 17:24
    Moderador
  • excelente respuesta, admito que no he trabajdo con binding de hecho eso estava viendo ahora, si el timer lo que hace es actualizar cada segundo mi datagridview y eso igual no es factible, yo como cargo mi datagrid, creo un datatable por codigo y luego se lo doy de datasource a mi datagridview, nesestio ver como funciona lo que explicas del binding ahi asi ando perdido, ya que jamas lo he utilizado, lo empezare a checar y a implementar y posteo mis avances un saludo, webjose es usted un maestro.

    si mi respuesta te ayudo votala como util, si resolvio tu duda marcala como respuesta, de esta manera ayudas a otros compañeros que tengan dudas similares.

    miércoles, 10 de octubre de 2012 17:41
  • En el vínculo de mi firma encontrará un artículo (en inglés pues nunca encuentro tiempo para traducirlo) que explica una forma rápida de implementar INotifyPropertyChanged.  En lo personal la uso sin mayor problema.  Puedo escribir una clase completa usando eso + code snippets en 2 minutos.  Puede echarle un vistazo y cualquier duda que tenga pues me la pregunta.

    Jose R. MCP
    Code Samples

    miércoles, 10 de octubre de 2012 17:47
    Moderador