jueves, 13 de mayo de 2010

Datagridview EndEdit Problema, no graba la última fila ingresada, el usuario debe cambiarse de fila. Si pulso el botón de grabar, no actualiza BD


Estimados lectores, ha sido una experiencia agradable el hacer este blog y tener algunos lectores que comparten el gusto por la programación; actualmente estoy empezando otro proyecto, muy personal,  con tecnología web  que espero compartir con toda la comunidad de programadores y necesito recursos porque es algo muy personal y mi situación financiera no es muy buena.
 Si alguien desearía apoyarme  tengo una tarjeta Oxxo Saldazo con el número:  4766-8408-7508-1593, cualquier apoyo lo pueden hacer en cualquier tienda Oxxo o en Banamex, les agradezco y que sus proyectos lleguen a buen fin.
 www.artprogramnet.wordpress.com
Un detalle que se observa en el datagridview, es que para que los datos modificados sean grabados en la base de datos, debe moverse de fila(también pasa cuando el datagrid tiene la propiedad readonly a true y los valores se llenan desde textbox), para así internamente el datagridview confirme los cambios a sus tablas subyacentes, este comportamiento causa los siguientes problemas:
1.-El usuario modifica una celda del datagridview y de inmediato pulsa el botón de grabar, no graba la fila en que está posicionado.
2.-De un conjunto de filas modificadas, la última no se graba.

Bueno para solucionar este detalle, en el botón de grabar, se recorre la tabla subyacente que en este caso se llama dtabalumnos y finalizo todos los cambios pendientes de cada fila.
Luego finalizó todos los cambios pendientes del datagridview, que en este caso se llama dgalumnos
Dim filaalumno As DataRow
For Each filaalumno In dtabalumnos.Rows
filaalumno.EndEdit()
Next filaalumno
Dgalumnos.EndEdit()
Nota: se debe finalizar la edicion de la fila con endedit y despues el datagridview, de otra manera no funciona.
Si han encontrado otra solución mas sencilla, no duden en compartirla

15 comentarios:

  1. Muchas gracias por la solución, estoy empezando con .NET y estoy vuelto loco, te he puesto en mis favoritos.

    Paco.

    ResponderEliminar
  2. Saludos Paco, que bueno que te haya servido la solución!.
    Suerte con el Visual Net y tus futuros proyectos.

    ResponderEliminar
  3. Saludos,

    Estoy haciendo lo siguiente en el botón guardar, y aun así no funciona. Es posible que tenga que hacer algo más antes??

    For Each dr As DataRow In varDT.Rows
    dr.EndEdit()
    Next dr
    DGV_Perfiles.EndEdit()

    Gracias por por tu ayuda...

    ResponderEliminar
  4. Me faltaba terminar la edición en el BindingSource:

    BS_Perfiles.EndEdit()

    Y listo.

    ResponderEliminar
  5. Andrea, gracias por tu aportación. Yo en lo particular no ocupo BindingSource, pero que bueno que ya te haya orientado el artículo y a la vez nos hayas aportado la solución cuando se ocupa BS.
    Saludos

    ResponderEliminar
  6. muy bueno, me parece increíble un error así, pero la solución es válida. Gracias

    ResponderEliminar
  7. Gracias a ti anonimo por comentar. Pues si tienes razón,a veces pienso que en lugar de dedicar tanto tiempo a lanzar nuevas versiones y herramientas sofisticadas, Microsoft o cualquier otra compañia, deberian concentrarse en facilitar y perfeccionar cosas tan basicas como esta. Otros ejemplos:la concurrencia cuando varias personas entran al mismo registro e intentan grabar con la misma clave(la base de datos no esta enterada de los cambios, puesto que estan desconectados), combos --tambien tienen sus detalles-- y muchos otros problemas que se dan en la vida real de los desarrolladores, en fin. Saludos !

    ResponderEliminar
  8. Gracias por colaborar.
    Creo que no hace falta recorrer todas las filas del datatable, solo hacer endedit en la fila en edicion y salvar la tabla.
    dgv.endedit
    dataset.tables("tabla").rows(dgv.currentcell.rowindex).endedit
    dataadapter.update(dataset,"tabla")

    Si les sirve, un saludo.

    ResponderEliminar
    Respuestas
    1. eres un genio anónimo, me sirvió de mucho gracias

      Eliminar
  9. Gracias por comentar y darnos una solución.
    Habria que probarla y ver si funciona, aunque a primera vista deberia ser al reves, o sea, primero darle endedit al renglón y después al grid, tambien observo que es solo una celda y deberia ser todo el renglón, porque en este caso estas grabando desde varios textbox hacia diferentes celdas del renglon de tu grid.
    Bueno si alguien tiene oportunidad de probarlo y funciona, ojala que nos avise.
    saludos

    ResponderEliminar
  10. Esto funciona si lo pones en un botón

    SqlDataAdapter.Update(dataset, "mitabla")
    dataset.AcceptChanges()

    Pero no funciona si lo pones en un evento del datagrid

    Por ejemplo en el evento CellValueChanged no me sirve este codigo. No guarda:

    If e.ColumnIndex = 0 AndAlso e.RowIndex <> -1 Then
    Else
    SqlDataAdapter.Update(dataset, "mitabla")
    dataset.AcceptChanges()
    End If

    Saludos

    ResponderEliminar
  11. Hola :
    Esto ultimo no me funciona, pero si me funciona :
    Creo que no hace falta recorrer todas las filas del datatable, solo hacer endedit en la fila en edicion y salvar la tabla.
    dgv.endedit
    dataset.tables("tabla").rows(dgv.currentcell.rowindex).endedit
    dataadapter.update(dataset,"tabla")
    Muchas Gracias a los que colaboran.

    ResponderEliminar
    Respuestas
    1. Si es muy posible que no haga falta reccorrer todas las filas, pero habra que probar y asegurnos de que asi sea.
      Saludos y gracias por compartir y comentar

      Eliminar
  12. Lo solucioné de esta manera:
    dataGridView1.EndEdit(); _tresultado.Rows[dataGridView1.CurrentRow.Index].EndEdit();

    ResponderEliminar
    Respuestas
    1. Gracias Ricardo por la solución, aunque irse directamente al datagridview puede ser que no funcione en todos los casos, ya que la tabla subyacente puede tener otros valores, sobre todo cuando haz hecho varias moidficaciones y estas no se han grabado sino hasta el final las vas a confirmar, pero habra que probar, suerte con tus poyectos, Saludos!

      Eliminar