none
recorrer datagrid en vb.net RRS feed

  • Pregunta

  • Hola a todos:
    Tengo un mantenimiento donde creo las monedas y sus demas campos, quiero actualizar cualquier campo del mantenimiento dentro del mismo datagrid
    hasta ahi no tengo problemas.
    el problema viene que cuando quiero actualizar debo leer el datagrid completo porque no se cuales campos han cambiado, entonces tengo el siguiente codigo
    para recorrer el datagrid pero no lo hace, es decir el ciclo se hace la misma cantidad de registros que tiene el datagrid pero solo me actualiza el ultimo
    registro seleccionado del datagrid.
    Si alguien puede ayudarme se lo agradezco...
    Codigo..

    If dgvGridmoneda.Rows.Count > 0 Then
                    For i As Integer = 0 To dgvGridmoneda.Rows.Count - 1
                        If dgvGridmoneda.Item("dtgtasa_moneda", dgvGridmoneda.CurrentRow.Index).Value() = Nothing Then
                            MessageBox.Show("Debe especificar la  tasa de la moneda.", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
                            txtmoneda.Focus()
                            Exit Sub
                        End If
                        MessageBox.Show(i)
                        ''MessageBox.Show(dgvGridmoneda.CurrentRow.Index)
                        ''MessageBox.Show(dgvGridmoneda.Item("dtgtasa_moneda", dgvGridmoneda.CurrentRow.Index).Value())
                        SQL = "update moneda set tasa_moneda = @tasa_moneda,desactivado = @desactivado where moneda = @moneda"
                        objCommand.Parameters("@moneda").Value = dgvGridmoneda.Item("dtgmoneda", dgvGridmoneda.CurrentRow.Index).Value()
                        objCommand.Parameters("@tasa_moneda").Value = dgvGridmoneda.Item("dtgtasa_moneda", dgvGridmoneda.CurrentRow.Index).Value()
                        objCommand.Parameters("@desactivado").Value = dgvGridmoneda.Item("dtgdesactivado", dgvGridmoneda.CurrentRow.Index).Value()

                    Next
                Else
                    MessageBox.Show("No hay nada que actualizar en el data grid, favor revisar....", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
                    Exit Sub
                End If

    lunes, 16 de febrero de 2009 3:10

Todas las respuestas

  • Hola reywel,

    el DataGrid lo tienes asociado a un DataSet mediante su DataSource? O quizás utilices un DataTable?

    Si es así, para obtener aquellas filas que hayan sido modificadas (añadidas, actualizadas o eliminadas) puedes ir al DataSet o DataTable que hace de DataSource de tu DataGrid y utilizar el método GetChanges() --> Te devolverá o bien un DataSet o bien un DataTable (en función del objeto que estés utilizando). El objeto que te devuelva, puedes actualizarlo a la base de datos llamando al método AcceptChanges y luego al método Update();

    Sino, en tu código faltaría ejecutar el comando por cada linea que encuentre no? Yo quizás lo modificaría así:

    using(objConnection As Common.DbConnection )
    {
     
            'Deberías utilizar una transacción para asegurarte de que se guardan todos los cambios. Sino, ninguno.  
            Dim objTransaction As Common.DbTransaction = objConnection.BeginTransaction()  
     
     
            If dgvGridmoneda.Rows.Count > 0 Then 
                For i As Integer = 0 To dgvGridmoneda.Rows.Count - 1  
     
                    'Creamos el objeto command por cada linea a actualizar.  
                    Dim objCommand As Common.DbCommand = objConnection.CreateCommand() 

                    'Asociamos la transacción al comando actual 
                    objCommand.Transaction = objTransaction  
     
                    If dgvGridmoneda.Item("dtgtasa_moneda", dgvGridmoneda.CurrentRow.Index).Value() = Nothing Then 
                        MessageBox.Show("Debe especificar la  tasa de la moneda."Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)  
                        txtmoneda.Focus()  
                        objTransaction.Rollback()  
                        Exit Sub 
                    End If 
                    MessageBox.Show(i)  
                    ''MessageBox.Show(dgvGridmoneda.CurrentRow.Index)  
                    ''MessageBox.Show(dgvGridmoneda.Item("dtgtasa_moneda", dgvGridmoneda.CurrentRow.Index).Value())  
                    Sql = "update moneda set tasa_moneda = @tasa_moneda,desactivado = @desactivado where moneda = @moneda" 
     
                    objCommand.Parameters("@moneda").Value = dgvGridmoneda.Item("dtgmoneda", dgvGridmoneda.CurrentRow.Index).Value()  
                    objCommand.Parameters("@tasa_moneda").Value = dgvGridmoneda.Item("dtgtasa_moneda", dgvGridmoneda.CurrentRow.Index).Value()  
                    objCommand.Parameters("@desactivado").Value = dgvGridmoneda.Item("dtgdesactivado", dgvGridmoneda.CurrentRow.Index).Value()  
     
                    'Ejecutamos la consulta por cada fila.  
                    objCommand.ExecuteNonQuery()  
     
                Next 
     
                objTransaction.Commit()  
            Else 
                MessageBox.Show("No hay nada que actualizar en el data grid, favor revisar...."Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)  
                objTransaction.Rollback()  
                Exit Sub 
            End If 
    }

    Sólo actualizas la última fila (ya que en el código no se llama en ningún momento al método ExecuteNonQuery del objeto objCommand). Debes llamar a este método por cada linea a actualizar. Además deberías utilizar una transacción para asegurarte de que todo acaba correctamente (y no ocurre un error a medio actualizar).

    Espero que te sirva de ayuda!

    Si es así, porfavor, marca la respuesta como válida! ;)

    Gracias y suerte!
    ===================================================================================== Javier Jiménez Roda MCP (Microsoft Certified Professional) MCTS Web Apps (Microsoft Certified Technology specialist)
    lunes, 16 de febrero de 2009 11:37
  • Al codigo de Javier Roda le falta controlar el currentrow; el codigo similar quedaria asi:

            If DataGridView.Rows.Count > 0 Then
                For i As Integer = 0 To DataGridView.Rows.Count - 1
                   DataGridView.CurrentCell = DataGridView.Rows(i).Cells(0)
                    If DataGridView.Item("CodigoTabla1", DataGridView.CurrentRow.Index).Value() =                                       ComboBox1.SelectedValue Then
                        MsgBox("El Codigo Seleccionado del Combobox ya ha sido utilizado en el Datagrid                                  y No puede repetirse!")
                        Me.ComboBox1.Focus()
                        Exit Sub
                    End If
                Next i

            End If

    jueves, 20 de septiembre de 2012 2:47