¿Como Actualizar un GridView con Enlace a Datos en Tiempo de Ejecución?

Ayer martes por la mañana, uno de mis amigos me pidió ayuda con la grilla para web de Visual Studio 2005 (GridView), me dijo que no puede realizar actualizaciones de datos haciendo el enlace en tiempo de ejecución, es decir hacer todo por código, sin utilizar los componentes en tiempo de diseño con lo que se puede hacer la actualización de datos en pocos minutos.

Le dije (que no sabes hacer una cosa tan básica) no hay problema, en 20 minutos te mando un ejemplo completo; antes había trabajado de esta manera con el Framework 1.1 y el componente DataGrid sin ningún problema, pero grande fue mi sorpresa al ver que con el GridView las cosas se complicaban enormemente y algo que parecía tan básico no lo era tanto al menos para mi, luego de revisar muchas páginas con ejemplos, casi reventar el monitor con la cabeza y 3 horas de trabajo, al fin logré hacer andar el bendito ejemplo, a continuación algunas pautas para no enloquecer en el intento:

1. No te olvides que estas trabajando en un ambiente Web.- Debo confesarlo esto ya me había pasado antes, Visual Studio te da tantas facilidades para diseñar tus formularios de manera visual, que uno pierde la noción que esta desarrollando una aplicación web, y el error que me estaba volviendo loco esta relacionado simple y llanamente con el código que puse en el evento Load del formulario; como todos saben, el evento Load se dispara cada vez que la pagina se carga, incluido los PostBack necesario para realizar cada acción (por ejemplo pulsar un botón), para resolver el problema simplemente usamos la propiedad IsPostBack de la clase Page, que nos indica si es la primera ves que se carga la pagina o no:

if (Page.IsPostBack)
{
      //Se ejecuta todas las veces que se carga la pagina exepto la
      //primera vez
}
else
{
      // Se ejecuta solo la primera vez que se carga la pagina
{

2. Convertir las columnas en Plantillas.- Para facilitar el trabajo de recuperar los datos del registro que se esta editando, es necesario cambiar los tipos de columnas de BoundField a TemplateField, de esta manera podremos recuperar los datos que se están ingresando en cada uno de controles de la plantilla, utilizando el método FindControl.

3. Implementar los eventos del GridView que necesitemos.- Esta parte es muy importante, puesto que en estos eventos tendremos que poner toda la lógica para realizar la actualización de datos, los eventos más importantes que tenemos que interceptar son: RowEditing, RowUpdating, RowCancelingEdit y RowDeleting.

//método auxiliar para facilitar el trabajo de enlace a datos
void EnlazarDatos()
{
      //sdsEmpelado es un ObjectDataSource previamente configurado
      GridView1.DataSource = sdsEmpleados;
      GridView1.DataBind();
}

void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
      //estableciendo la propiedad EditIndex hacemos que esa fila se
      //ponga en edición
      GridView1.EditIndex = e.NewEditIndex;
      EnlazarDatos();
}

void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
      //recuperamos la fila que estamos editando
      GridViewRow fila = GridView1.Rows[e.RowIndex];
      //inicializamos los parametros para actualizar
      sdsEmpleados.UpdateParameters[«EmployeeID»].DefaultValue =
            (fila.FindControl(«Label1») as Label).Text;
      sdsEmpleados.UpdateParameters[«LastName»].DefaultValue =
            (fila.FindControl(«TextBox2») as TextBox).Text;
      sdsEmpleados.UpdateParameters[«FirstName»].DefaultValue =
            (fila.FindControl(«TextBox3») as TextBox).Text;
      //Ejecutamos la actualización
      sdsEmpleados.Update();
      //para salir del estado de edición
      GridView1.EditIndex = -1;
      EnlazarDatos();
}

void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
      //para salir del estado de edición
      GridView1.EditIndex = -1;
      EnlazarDatos();
}

void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
      //recuperamos la fila que queremos eliminar
      GridViewRow fila = GridView1.Rows[e.RowIndex];
      //Inicializamos los parametros para eliminar
      sdsEmpleados.DeleteParameters[«EmployeeID»].DefaultValue =
            (fila.FindControl(«Label1») as Label).Text;
      //Ejecutamos la eliminación
      sdsEmpleados.Delete();
      //para que se actualice el grid
      EnlazarDatos();
}

Atención, el código que se muestra es solo un ejemplo, por simplicidad está sin las validaciones necesarias (por ejemplo comprobar que no sean nulos algunos objetos).

Si necesitan revisar un ejemplo totalmente funcional pueden descargar el ejemplo que hice para mi amigo, funciona con la base de datos Northwind con los tres primeros campos de la tabla Employees, utiliza la clase SqlDataSource, también se puede hacer con la clase SqlDataAdapter, pero como estamos trabajando con el .Net Framework 2.0, decidí utilizar la nueva clase SqlDataSource, espero que les sirva de algo.

Descargar Ejemplo: Ejemplo Actualización GridView
Favor de darle clic derecho y guardar destino como…, una vez descargado cambiar la extensión a .zip, y descomprimirlo (todo esto porque no me dejan subir archivos zip).

45 comments so far

  1. CHRISTIAN RUIZ on

    jaja con solo saber que yo fui el amigo que le dijo esa pregunta, jajaja bueno DOC gracias por la ayuda, me salvaste el dia, Muchas Gracias.

  2. Marlene Velozo on

    Eloy Paredes Quispe:

    Gracias por la ayuda funcioan todo en perfectas condiciones

  3. luis on

    Te felicito por el gran aporte que nos das.

  4. rene morales on

    Si me sirvio bastante la ayuda. Mi pequeño percance es que pues la manipulación de controles en Vb es diferente y pues no he podido darle solución a este trabajo gracias

  5. El AleX on

    Me estaba volviendo loco, Gracias

  6. Xochilt on

    Disculpen mi ignorancia, descargue el ejemplo y me bajo un archivo de Word.doc y al quererlo habrir no pude, podrian ayudarme.

    Gracias de antemano

  7. Karla Páez on

    Excelente artículo, modifique algunos métodos de acuerdo a mis necesides y funciona perfectamente, muchasss gracias :D…yo también empezaba a volverme loquita..jajaja

    Para el amigo que dejó este mensaje:
    ————————————————–
    Disculpen mi ignorancia, descargue el ejemplo y me bajo un archivo de Word.doc y al quererlo habrir no pude, podrian ayudarme.

    Gracias de antemano
    —————————————————
    Unicamente tienes que cambiar .doc a .zip y listo tendrá el archivo comprimido del ejemplo 😉

  8. Pacey Master on

    me sirvio, vale por el dato.

    con la ayuda que me haz dado pude seleccionar una tupla del gridview y mostrarla en un detailsview para poder updatear la tupla y así realizar los cambios en la tabla correspondiente y en su consulta sql la cual se muestra en mi gridview.

    «Se aquello para lo que haz nacido»

  9. Frank on

    Al igual que muchos, excelente articulo, o estoy haciendo todo «a pie» incluso sin el uso de los eevntos del gridview y tu arituculo me soluciono mi problema.

    Aclaro, sigo con todo a pie 🙂

  10. Fabián H. on

    Excelente, didáctico y profesional.
    Me has ayudado mucho.
    Que Dios te bendiga.

    Fabián.

  11. Fabián H. on

    Eloy,
    he implementado tu ejemplo y anda muy bien, excepto por un problema que tengo con la paginación.
    Utilizando sqlDataSource supongo que con el DataSourceMode en DataSet como valor predeterminado debería funcionar dado que soporta ICollections.
    pero no me pasa a la pagina 2.
    Alguna pista que me puedas dar?
    desde ya muchas Gracias.

    Fabián. H.

  12. Juan Antonio on

    Agradezco de antemano que hallas puesto un ejemplo tan claro para resolver mis dudas.
    Saludos.

  13. Juan Carlos on

    Muy bien te felicito, pero aun falta algo mas complejo, en lo cual si estoy batallando lo cual es lo siguiente.

    -Crear las conexiones en tiempo de ejecucion
    -Crear los grids en tiempo de ejecucion
    -Crear los eventos de los grids
    -Añadirle datos
    -Y lo mas importante poder modificarlos(editar, actualizar).

    ya logre hacer los primeros 4 pasos y me permite editar pero me trae problemas al momento de actualizar por culpa de Databind() del grid. Si lo llegaras a resolver te lo agradeceria. y si pudieras mandarme tu respuesta.

    Ahora si que todo es a pata… jejjee… nos vemos

  14. sharysce on

    hola: y si necesito insertar filas sin la utilizacion del dataset, como se podria hacer eso??

  15. sharysce on

    mmmmm!!!

  16. Manter on

    Gracias por tu ejemplo, pero sabes soy nuevo en esto y me marca un error a la hora de correr la aplicacion, si pudieras o alguien que ya lo corrio pudiera ayudar, el error que me marca es el siguiente:

    Línea 19: ASP.NET to identify an incoming user.
    Línea 20: –>
    Línea 21:
    Línea 22: <!–
    Línea 23: The section enables configuration

  17. Michbo on

    hola man pero como hacer:

    sdsEmpelado es un ObjectDataSource previamente configurado

  18. Lenin on

    Hola,
    Felicidades por el ejemplo, una consulta, sin querer abusar. Tengo la curiosidad o mas bien la necesidad de tener un gridview, con varias columnas, cada columna con un templatefiel para un textbox, lo que quiero hacer es que si en la columna Codigo ingreso un código de producto, el programa vaya a la base de datos y traiga la descripción, precio y colocarlos en las columnas siguientes.

    He intentado de varias formas, pero no logro hacer que suceda esto.

    Quedo muy agradecido

    Lenin

  19. Freddy on

    trust me! i have a few friends, they cannot do this!
    good work! thanks a lot!

  20. Alex on

    Amigo eres un sabio

  21. Mauricio on

    Muchas gracias … fue muy útil…

  22. rene on

    Hola, llegué aquí buscando algo similar a mi problema.
    Tengo mi evento migridview_RowDeleting que funciona perfectamente. En el evento Page_Load tengo mi validación
    If Not Page.IsPostBack
    codigo1()
    End If
    Si puedes ayudarme, quisiera saber ¿Por qué al eliminar una fila de mi gridview entra a codigo1()?. Luego de ejecutar codigo1() va al código que hay en migridview_RowDeleting. Lo lógico es que no hubiese entrado a codigo1() y que sólo ejecutara el codigo de migridview_RowDeleting. Si tienes alguna idea o sugerencia la agradecería bastante.
    Gracias de antemano,

  23. tonny on

    Hola Gracias por el aporte compañero, la verdad me fue muy útil tu ejemplo, lo cheque y funciona a la perfeccion.

    Se te agradece tu tiempo y dedicacion en compartirnos.

  24. nruiz on

    Yo no puedo tener un amigo como tú? 😉

  25. Elisa Rodriguez H. on

    hola se puede hacer un update al grid view sin tener que dar click en el boton edit y despues en el boton actualizar?

    Se puede actualizar muchas filas a la vez, con tan solo dar click en un boton de guardar??

    • eloyparedes on

      Hola Elisa, si lo que quieres es agregar programáticamente registros al gridview( puede ser uno o varios a la vez), tienes que enfocar el problema desde un ángulo ligeramente diferente, en realidad debes agregar los registros a la fuente de datos a la que esta enlazado el gridview, puede ser un dataset, un datatable o una colección personalizada que tu creaste, una vez agregados los registros programáticamente al origen de datos tendrás que volver a hacer el bind del gridview , no estoy seguro pero me parece que el gridview tiene un método Rebind(), para que muestre los nuevos datos de su origen de datos.

      Espero te sirva de algo.

      • Elisa Rodriguez H. on

        gracias por el aporte, lo estoy intentando, pero yo quiero hacer un update masivo del gridview

  26. Elisa Rodriguez H. on

    gracias por tu ayuda, lo estoy intentando, pero lo que quiero hacer es un update masivo del gridview……

  27. FrankoFull on

    Simplemente Gracias xD

  28. David on

    Eloy, muy buen ejemplo.

    Lo hago al pie de la letra pero todavía al actualizar me guarda el valor antiguo del textbox.

    Quisiera saber si al Gridview hay que modificarle alguna propiedad para que tome el nuevo valor.

    Gracias y Saludos, David

  29. David on

    Eloy:
    El GridView lo tengo bindeado a una lista tipada de objetos con 2 atributos.

  30. Ramon on

    Muchisimas gracias, es de gran ayuda paa los que recien empezamos.

  31. Jaguar on

    Disculpen la molestia pero alguien tendrá el código en VB, estoy realmente atorado en esto, y para variar soy novato en programación.

    Saludos..

  32. Laura Arevalo on

    muy buen ejemplo que despues de 4 años sirve aun. gracias

  33. patsy on

    disculpa tengo una duda, estoy haciedno tmb un update aun tabla y tengo todo parecedio a loq ue tu tienes con la excepcion de que yo tengo dos dropdownlist y cuando llega a querer obtener la informacion de ahi me amrca error, lo debugeo y lo que pasa es que entra al Rowupdating y todo pasas bien pero vuelve a entrar y cuadno llega al del combo trueba me amrca un nullexception y no se porque pasa es es como si el GVautorizacion.EditIndex = -1 no me sacara de la edicion se vuelva ah ahcer y como si se borrara lo que tiene el combo sabe sporque pasa eso???

  34. Charly on

    hola que tal de casualidad no tendras ese codigo pero en basic. Y gracias

  35. Brisa on

    Hola, me parece excelente tu aportación. Sin embargo, los datos que necesito mostrar en el Grid son resultado de una consulta que el usuario elige en linea (variable (DRowDropList), periodo de tiempo(2 Calendar), como puedo alimentar mi grid despues de dar click en el boton consulta, para despues editarlos, si la variable tiene un valor fuera de rango. Espero me puedas ayudar.

  36. julian on

    Estuve todo el día por solucionar del evento updating, gracias amigo por el aporte, a este tiempo todavía es importante.

  37. Alicia on

    Necesito esto pero para VB 6. Para un sistema viejito que estoy modificando. Alguien puede darme una manito??

  38. Nery on

    Tengo un proyecto de facturacion, selcciono los productos que necesito facturar de un datagrid llamado grillaProductos y los agrego a otro data grid llamado GrillaDetalle, luego guardo todos esos datos del data grid grilladetalle en una tabla de acces llamada DETALLE_FACTURA, mi pregunta es ¿Como hago si en vez de guardar esos productos del datagrid detalle, los quiero modificar en la tabla productos para cambiarle la existencia de esos productos y asi llevar un control de existencias.
    Ya probe que cada que agrego un producto al detalle modifico su
    la cantidad o existencias de rpductos, el problema esque si por x ó y razón no termino o no guardo esa factura, entonces la cantidad o existencia de esos productos ya se han modificado y sin generar una factura entonces quedan rebajados esos productos pero no estarian facturados, otro problema seria si quiero modificar o eliminar una factura, las cantidades de esos productos facturados no regresarian al inventario de no ser que se rebajen uno por uno. Soy nuevo en programacion espero me haya dado a entender, si alguien tiene un ejemplo de modificar varios registro en un solo clic xfavor ayudenme.gracias

  39. eloyparedes on

    Buen día Nery.

    Básicamente tu problema pasa porque necesitas utilizar un mecanismo que seguramente debes conocer, se llaman transacciones, una de las propiedades de las transacciones se denomina atomicidad, lo cual es justamente lo que necesitas, tu puedes indicar que la operación de almacenamiento de la factura y el respectivo descuento del inventario de los productos forman parte de una transacción, hecho esto, la transacción asegura que estas dos operaciones se ejecuten únicamente en conjunto, es decir si las operaciones se llevan a cabo sin ningún error, la transacción se completa (commit) y las dos operaciones quedan registradas en la base de datos, si por el contrario una de las operaciones produce algún error, entonces toda la transacción se cancela (roollback), y por tanto si ya se había registrado la factura esta se elimina automáticamente de la base de datos y todo el estado de la base de datos es el que tenía antes de generar la operación.

    Ahora tu me dices que utilizas Access para tu base de datos, la verdad que nunca he utilizado Access y no sabría decirte si soporta transacciones, en todo caso cualquier gestor de base de datos de verdad soporta transacciones, si tienes la oportunidad te recomendaría utilizar SQL Server, que tiene una versión Express que es de uso gratuito y que puedes descargar directamente de la pagina de Microsoft.

  40. Gleomar on

    Gracias Totales !!!!!!!!!!!!!!!

  41. Milling on

    Porfa, tienes el mismo código pero en VB, te lo agradecería

  42. Andrés on

    A pesar de que la entrada es muy antigua me sirvió enormemente. Muchas Gracias.

    Como comentario extra y si a alguien como yo, que no es muy experimentado en el tema le pasa, comparto lo siguiente:

    Utilicé el codigo en visual basic, y al llegar a la parte de los controles me indicaba que: un control «System.Web.UI.control» no puede convertirse en string, lo cual se solucionó utilizando la funcion trycast que convierte los tipos (o sea queda bien), sin embargo devuelve nothing, y a pesar de que actualiza correctamente produce el error en tiempo de ejecucion (Referencia a objeto no establecida como instancia de un objeto). esto lo solucioné con un try catch (creo q hay mas formas pero no las conozco).

    aqui como queda:

    try

    sdsEmpleados.UpdateParameters(«usuario»).DefaultValue = TryCast(fila.FindControl(«Label1»), Label).Text

    Catch ex As Exception

    End Try

    Exitos.

  43. David on

    Excelente loco sds gran aporte


Replica a sharysce Cancelar la respuesta