none
Duda con Loop For Each en DataGridView RRS feed

  • Pregunta

  • Buen día, tengo una duda con respecto al funcionamiento del Loop For Each en el DGV, en mi caso puntual estoy actualizando información de éste a una BD en Access

           Try
                For Each Fila As DataGridViewRow In DgvComprobante.Rows
                    Dim SqlQueryPrueba As New OleDbCommand("UPDATE Movimientos SET Cantidad=@Cant WHERE CentroCostos=@CC AND Codigo=@Cod", ConexionMovimientos)
                    SqlQueryPrueba.Parameters.AddWithValue("@Cant", Fila.Cells(2).Value.ToString)
                    SqlQueryPrueba.Parameters.AddWithValue("@CC", Fila.Cells(3).Value)
                    SqlQueryPrueba.Parameters.AddWithValue("@Cod", Fila.Cells(0).Value)
                    ConexionMovimientos.Open()
                    SqlQueryPrueba.ExecuteNonQuery()
                    ConexionMovimientos.Close()
                Next
            Catch ex As Exception
                MessageBox.Show(ex.ToString)
                ConexionMovimientos.Close()
            End Try

    El loop funciona perfectamente y me actualiza los datos de manera correcta, pero al final de la instrucción me da el error de "Referencia a Objeto no Establecido..." que generalmente se presenta cuando hay algún campo nulo o un dato con conversión errónea, lo que no es el caso.

    Solo me cabe suponer que el Loop continúa corriendo hasta que se cruza con una Fila del DGV en blanco e intenta insertar esa, ahora mi pregunta... ¿Hay alguna manera de hacer que el loop sepa cuándo detenerse? Que solo me tome las filas que tienen información tabulada?

    PD: El error se puede enmascarar con el Try...Catch y generar un mensaje a mi antojo, pero la verdad no se me antoja muy adecuado que sea así, preferiría encontrar una manera de solucionar ese error.

    De antemano muchas gracias por la atención y ayuda prestada en el caso.


    jueves, 2 de junio de 2016 17:36

Respuestas

  • hola

    >>¿Hay alguna manera de hacer que el loop sepa cuándo detenerse?

    podrias validar esa row

    Try
    	For Each Fila As DataGridViewRow In DgvComprobante.Rows
    		
    		If Fila.Cells(0).Value Is Nothing Then
    			Continue
    		End If
    	
    		Dim SqlQueryPrueba As New OleDbCommand("UPDATE Movimientos SET Cantidad=@Cant WHERE CentroCostos=@CC AND Codigo=@Cod", ConexionMovimientos)
    		SqlQueryPrueba.Parameters.AddWithValue("@Cant", Fila.Cells(2).Value.ToString)
    		SqlQueryPrueba.Parameters.AddWithValue("@CC", Fila.Cells(3).Value)
    		SqlQueryPrueba.Parameters.AddWithValue("@Cod", Fila.Cells(0).Value)
    		ConexionMovimientos.Open()
    		SqlQueryPrueba.ExecuteNonQuery()
    		ConexionMovimientos.Close()
    	Next
    Catch ex As Exception
    	MessageBox.Show(ex.ToString)
    	ConexionMovimientos.Close()
    End Try	

    o sino es util eliminar esa ultima row definiendo al propiedad AllowUserToAddRows en false

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Raúl Ramírez jueves, 2 de junio de 2016 17:58
    jueves, 2 de junio de 2016 17:42

Todas las respuestas

  • hola

    >>¿Hay alguna manera de hacer que el loop sepa cuándo detenerse?

    podrias validar esa row

    Try
    	For Each Fila As DataGridViewRow In DgvComprobante.Rows
    		
    		If Fila.Cells(0).Value Is Nothing Then
    			Continue
    		End If
    	
    		Dim SqlQueryPrueba As New OleDbCommand("UPDATE Movimientos SET Cantidad=@Cant WHERE CentroCostos=@CC AND Codigo=@Cod", ConexionMovimientos)
    		SqlQueryPrueba.Parameters.AddWithValue("@Cant", Fila.Cells(2).Value.ToString)
    		SqlQueryPrueba.Parameters.AddWithValue("@CC", Fila.Cells(3).Value)
    		SqlQueryPrueba.Parameters.AddWithValue("@Cod", Fila.Cells(0).Value)
    		ConexionMovimientos.Open()
    		SqlQueryPrueba.ExecuteNonQuery()
    		ConexionMovimientos.Close()
    	Next
    Catch ex As Exception
    	MessageBox.Show(ex.ToString)
    	ConexionMovimientos.Close()
    End Try	

    o sino es util eliminar esa ultima row definiendo al propiedad AllowUserToAddRows en false

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Raúl Ramírez jueves, 2 de junio de 2016 17:58
    jueves, 2 de junio de 2016 17:42
  • Muchísimas gracias Leandro.

    Era justamente lo que necesitaba, ya no me genera el error que aparecía en el Try...Catch y el programa corre sin interrupciones.

    jueves, 2 de junio de 2016 17:59