none
Agregando fila a un Dagridview con Datasource RRS feed

  • Pregunta

  • Hola a todos de foro: Posiblemente no he leido con atencion a los otros enlaces que tocan este tema, pero me gustaría presentar mi caso y a ver quien me ilumina.

    Tengo un data grid el cual cargo con una tabla desde un SUB: MisDAtos.CargaGrid(dgv) y en este SUB se crea un Datatable que se enlaza a el Datasource al Dgv. No uso ningun databinding.

    Cada ves que tengo que agregar una fila a este Dgv, creo nuevamente un Datatable:

    Dim dt As DataTable = DirectCast(dgv1.DataSource, DataTable)

    Dim row As DataRow = dt.NewRow
    row.Item("Codigo") = txtCodigo.Text
    row.Item("Descripcion") = txtDescrip.Text
    dt.Rows.Add(row)

    Pero no utilizo absolutamente este dt para cambiar los valores de mi Dgv o cuando borro una fila al dar clic a un botón.

    Mi preguntas son, si puedo corregir directamente el valor de alguna celda o borrar una fila de mi datagrid ¿por que tengo que crear otro Datatable y crear una fila para crear una nueva fila en mi datagrid?

    ¿Por que si tengo un Datasource en mi Datagridview con la información de donde obtuve los datos para llenar el grid, tengo que usar un databinding para actualizar mi tabla con los cambios realizados?

    ¿Como puedo actualizar mi tabla desde mi datagrid en una sola instruccion sin usar el Commanbuilder? ¿O tendría que hacerlo linea a linea si no quiero usar en Commanbuilder?

     

    Gracias como siempre por la ayuda recibida.

     

     

     

     

     


    visual basic express
    martes, 7 de septiembre de 2010 6:15

Respuestas

  • Me temo que tienes algunos errores de concepto en cuanto al DataBnding y la creación de obetos:

    [...] en este SUB se crea un Datatable que se enlaza a el Datasource al Dgv. No uso ningun databinding.
    Eso es un DataBinding. Cada vez que asignas cualquier cosa al DataSource de un control estás haciendo DataBinding.
    Cada ves que tengo que agregar una fila a este Dgv, creo nuevamente un Datatable:
    Dim dt As DataTable = DirectCast(dgv1.DataSource, DataTable)
    Eso no crea nuevamente un DataTable. Símplemente te recupera una referencia al mismo DataTable que habías creado la primera vez. No es uno nuevo.
    Pero no utilizo absolutamente este dt para cambiar los valores de mi Dgv o cuando borro una fila al dar clic a un botón.
    Bueno, ese DataTable está permanentemente conectado al Dgv. Cada vez que modificas algo en el Dgv, se modifica en el DataTable y viceversa. Por eso, añadir o borrar filas en el DataTable es un buen método para añadirlas o borrarlas en el Dgv.
    Mi preguntas son, si puedo corregir directamente el valor de alguna celda o borrar una fila de mi datagrid ¿por que tengo que crear otro Datatable y crear una fila para crear una nueva fila en mi datagrid?
    Recuerda que no es otro DataTable, sino que estás manejando todo el rato el mismo DataTable, y que está permanentemente vinculado al Grid.
    ¿Por que si tengo un Datasource en mi Datagridview con la información de donde obtuve los datos para llenar el grid, tengo que usar un databinding para actualizar mi tabla con los cambios realizados?

    ¿Como puedo actualizar mi tabla desde mi datagrid en una sola instruccion sin usar el Commanbuilder? ¿O tendría que hacerlo linea a linea si no quiero usar en Commanbuilder?


    No, en el DataSource del DataGridview no tienes información acerca de dónde obtuviste los datos. Los datos los pasaste de una tabla de la base de datos a un DataTable en memoria. A partir de ese momento se perdió toda información referente a la base de datos y sólo quedó la copia en memoria de los datos. Esta copia se la pasaste al DatatGridView, que por lo tanto no sabe nada acerca del origen de dichos datos.

    Para actualizar los datos en el servidor, tienes que ir enviando sentencias que le indiquen cuáles son esos cambios. Si los cambios están salvados dentro del DataTable, una forma de conseguirlo es recorriendo con un bucle uno por uno los registros del DataTable, construyendo las sentencias correspondientes y enviándolas al servidor. Esto lo podrías hacer a mano, pero como alternativa puedes usar un DataAdapter que ya hace por dentro esa operación. Por supuesto, para que el DataAdapter pueda hacerla, necesita conocer la estructura de las sentencias que ha de enviar al servidor. Estas se le pueden configurar a mano, pero una vez más, si no quieres molestarte en hacerlo, hay una herramienta que lo hace automáticamente: el CommandBuilder que ya has mencionado.

    Así que, como ves, lo que estás haciendo es lógico y razonable, y funciona como debe, teniendo en cuenta que cada uno de los elementos que usas sólo tiene la información que tiene y no puede inventársela automáticamente. Como alternativa, si no quieres programar tanto, puedes usar Vsual Studio para crear gráficamente un TableAdapter, con lo que se genera de forma automática el código fuente que inicializa el DataAdapter sin que tengas que preocuparte tú de usar el CommandBuilder.

     

    martes, 7 de septiembre de 2010 9:29

Todas las respuestas

  • Me temo que tienes algunos errores de concepto en cuanto al DataBnding y la creación de obetos:

    [...] en este SUB se crea un Datatable que se enlaza a el Datasource al Dgv. No uso ningun databinding.
    Eso es un DataBinding. Cada vez que asignas cualquier cosa al DataSource de un control estás haciendo DataBinding.
    Cada ves que tengo que agregar una fila a este Dgv, creo nuevamente un Datatable:
    Dim dt As DataTable = DirectCast(dgv1.DataSource, DataTable)
    Eso no crea nuevamente un DataTable. Símplemente te recupera una referencia al mismo DataTable que habías creado la primera vez. No es uno nuevo.
    Pero no utilizo absolutamente este dt para cambiar los valores de mi Dgv o cuando borro una fila al dar clic a un botón.
    Bueno, ese DataTable está permanentemente conectado al Dgv. Cada vez que modificas algo en el Dgv, se modifica en el DataTable y viceversa. Por eso, añadir o borrar filas en el DataTable es un buen método para añadirlas o borrarlas en el Dgv.
    Mi preguntas son, si puedo corregir directamente el valor de alguna celda o borrar una fila de mi datagrid ¿por que tengo que crear otro Datatable y crear una fila para crear una nueva fila en mi datagrid?
    Recuerda que no es otro DataTable, sino que estás manejando todo el rato el mismo DataTable, y que está permanentemente vinculado al Grid.
    ¿Por que si tengo un Datasource en mi Datagridview con la información de donde obtuve los datos para llenar el grid, tengo que usar un databinding para actualizar mi tabla con los cambios realizados?

    ¿Como puedo actualizar mi tabla desde mi datagrid en una sola instruccion sin usar el Commanbuilder? ¿O tendría que hacerlo linea a linea si no quiero usar en Commanbuilder?


    No, en el DataSource del DataGridview no tienes información acerca de dónde obtuviste los datos. Los datos los pasaste de una tabla de la base de datos a un DataTable en memoria. A partir de ese momento se perdió toda información referente a la base de datos y sólo quedó la copia en memoria de los datos. Esta copia se la pasaste al DatatGridView, que por lo tanto no sabe nada acerca del origen de dichos datos.

    Para actualizar los datos en el servidor, tienes que ir enviando sentencias que le indiquen cuáles son esos cambios. Si los cambios están salvados dentro del DataTable, una forma de conseguirlo es recorriendo con un bucle uno por uno los registros del DataTable, construyendo las sentencias correspondientes y enviándolas al servidor. Esto lo podrías hacer a mano, pero como alternativa puedes usar un DataAdapter que ya hace por dentro esa operación. Por supuesto, para que el DataAdapter pueda hacerla, necesita conocer la estructura de las sentencias que ha de enviar al servidor. Estas se le pueden configurar a mano, pero una vez más, si no quieres molestarte en hacerlo, hay una herramienta que lo hace automáticamente: el CommandBuilder que ya has mencionado.

    Así que, como ves, lo que estás haciendo es lógico y razonable, y funciona como debe, teniendo en cuenta que cada uno de los elementos que usas sólo tiene la información que tiene y no puede inventársela automáticamente. Como alternativa, si no quieres programar tanto, puedes usar Vsual Studio para crear gráficamente un TableAdapter, con lo que se genera de forma automática el código fuente que inicializa el DataAdapter sin que tengas que preocuparte tú de usar el CommandBuilder.

     

    martes, 7 de septiembre de 2010 9:29
  • Gracias por la repuesta Alberto, muy detallada.  El hacer un databinding me refería a lo siguiente:

    ' Dap es un adaptador de datos

    Dim tabla As New DataTable()
    Me.Dap.Fill(tabla)
    Me.bindingSource1.DataSource = tabla  'Primero creo esta instacia para despues

                                                                     'usarla en mi dgv

    dataGridView1.DataSource = Me.bindingSource1 

     

    Y lo que yo hago en mi codigo es lo siguiente:

     

     objDataAdapter.Fill(objDataSet, "Consulta1")
     objDataTable = objDataSet.Tables("Consulta1")
     MyDataGrid.DataSource = objDataTable     
                'Me salto el Databinding del ejemplo

                                                                                        'anterior

     

    ¿Cual es la diferencia? ¿Que pierdo y que gano con una u otra forma?

    Lo que yo quiero es hacer yo mismo la actualización de la tabla que utilicé para enlazar mi datagrid. El problema que no sé como resolverlo es el siguiente: en una misma sesion borro una fila de mi datatable, digamos que fué por error y nuevamente lo agrego. Si yo al final de la sesión actualizo mi tabla ¿como identifico las filas borradas y las nuevas?

    Gracias por tu ayuda.

     

     


    visual basic express
    martes, 7 de septiembre de 2010 17:36