none
Eliminar fila vacía en DatagridView. RRS feed

  • Pregunta

  • Hola de nuevo.

    Necesitaría eliminar las filas vacías de un datagridview que tengo enlazado mediante la propiedad DataSource al BindingSource de la tabla.

    Para ello le asigno al evento Click de un boton un bucle, quedando de esta forma:

     

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            For Each row As DataGridViewRow In COMPONENTESDataGridView.Rows

                If row.Cells(0).Value Is Nothing Then

                    ' Eliminamos la fila

                    COMPONENTESDataGridView.Rows.RemoveAt(row.Index)

                End If

            Next

    End Sub

    Pero no funciona, me da un error que me dice que la nueva fila sin confirmar no se puede eliminar.

    ¿conoceis algún método para eliminar filas vacías de un datagridview o del BindingSource?

    jueves, 25 de marzo de 2010 12:44

Respuestas

  • Lo acabo de probar y me sigue dando el mismo error pero esta vez en el último For Each

    Leandro Tuttini tiene razón, no se pueden eliminar ítems de una colección mientras la recorres. Lo de guardar los índices a eliminar en otra colección es buena idea, pero si no la inviertes y empiezas a eliminar los ítems desde el del índice mayor, seguirás teniendo el mismo problema.

    Podrías usar la solución que te ha propuesto Leandro, pero dándole la vuelta a la lista antes de recorrerla. El código quedaría tal que así:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim lista As New List(Of Integer)

        For Each row As DataGridViewRow In COMPONENTESDataGridView.Rows
            If row.Cells(0).Value Is Nothing Then
                lista.Add(row.Index)
            End If
        Next

        lista.Reverse()
        
        For Each item As Integer In lista
            COMPONENTESDataGridView.Rows.RemoveAt(item)
        Next
       
    End Sub

    Puede que ya lo hayas solucionado, pero al menos espero que a alguien le pueda resultar de ayuda.

    Un saludo.

    • Propuesto como respuesta adepa0 lunes, 19 de abril de 2010 9:38
    • Marcado como respuesta poliems jueves, 22 de abril de 2010 17:47
    lunes, 19 de abril de 2010 9:37

Todas las respuestas

  • hola

    segun veo el problema es que dentro del propio Fora Each no puedes quitar items de la colecion

     

    podrias crear una coleccion aparte y luego eliminar

    prueba algo asi

     

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim lista As New List(Of Integer)

        For Each row As DataGridViewRow In COMPONENTESDataGridView.Rows
            If row.Cells(0).Value Is Nothing Then
                lista.Add(row.Index)
            End If
        Next

        For Each item As Integer In lista
            COMPONENTESDataGridView.Rows.RemoveAt(item)
        Next
       
    End Sub

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 25 de marzo de 2010 12:56
  • Lo acabo de probar y me sigue dando el mismo error pero esta vez en el último For Each,

    también he probado cambiar el nombre de la primera celda que es "row.Cells(0).Value" por el nombre de la columna por este "row.Cells(""DNI").Value" pero tampoco y me sale el siguiente error:

    No se pudo encontrar la columna denominada DNI. Nombre del parámetro: columnName

     

    Si veo que está complicado buscaré otras alternativas, había escuchado algo de que no se podían borrar líneas en los datagridview que estaban enlazados...¿puede ser?, ¿no tendré que eliminarlas del BindingSource y actualizar el Datagridview?

     

    Gracias otra vez más, Leandro.

    jueves, 25 de marzo de 2010 13:11
  • hola

    otra alternativa podria ser que en tu consulta originas, en el query que haces a la db filtres estos campos vacios en el WHERE asi ya no los veras en la grilla

     

    con respecto al error del DNI, puedo ver que has usado: row.Cells(""DNI").Value

    y este tiene mal las comillas

    ademas tienes ese campo en la grilla ?

     

    saludos

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 25 de marzo de 2010 13:17
  • Lo acabo de probar y me sigue dando el mismo error pero esta vez en el último For Each

    Leandro Tuttini tiene razón, no se pueden eliminar ítems de una colección mientras la recorres. Lo de guardar los índices a eliminar en otra colección es buena idea, pero si no la inviertes y empiezas a eliminar los ítems desde el del índice mayor, seguirás teniendo el mismo problema.

    Podrías usar la solución que te ha propuesto Leandro, pero dándole la vuelta a la lista antes de recorrerla. El código quedaría tal que así:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim lista As New List(Of Integer)

        For Each row As DataGridViewRow In COMPONENTESDataGridView.Rows
            If row.Cells(0).Value Is Nothing Then
                lista.Add(row.Index)
            End If
        Next

        lista.Reverse()
        
        For Each item As Integer In lista
            COMPONENTESDataGridView.Rows.RemoveAt(item)
        Next
       
    End Sub

    Puede que ya lo hayas solucionado, pero al menos espero que a alguien le pueda resultar de ayuda.

    Un saludo.

    • Propuesto como respuesta adepa0 lunes, 19 de abril de 2010 9:38
    • Marcado como respuesta poliems jueves, 22 de abril de 2010 17:47
    lunes, 19 de abril de 2010 9:37
  • La fila para los nuevos registros del DataGridView no se puede quitar mediante programación de la colección Rows, tiene un tratamiento especial, pues automáticamente válida que desde esta no se puedan agregar nuevos registro. La fila para nuevos registros deshabilita estableciendo la propiedad AllowUserToAddRows en false. 

    Algo como esto:

    DGVDetalle.AllowUserToAddRows =

    false;

     

    foreach (DataGridViewRow row in DGVDetalle.Rows) {

     

        if (row.Cells["Name"].Value == null || String.IsNullOrEmpty(row.Cells["Name"].Value.ToString())){                     

                 this.DGVDetalle.Rows.Remove(row);

        }

    }

    this.BindingContext[MyBindingSource].EndCurrentEdit();

    lunes, 11 de octubre de 2010 17:03
  • Isa, muchas gracias por la información que aportas...

    Las líneas las intentaré pasar a Visual Basic y sin duda que me servirán en alguna ocasión, no obstante, solo comentarte que gracias a los colaboraciones que en su día de (marzo y abril) realizaron ya resolví este problema...

    Pero insisto, que siempre está bien tener información que amplíe o mejore la solución.

     

    Un saludo.

    lunes, 11 de octubre de 2010 17:50
  • Tal ves sea tarde, aun asi, les comparto esto

    Dim vrow as integer

     Private Sub DGRSel_CellLeave(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGRSel.CellLeave
         'Obtiene   el indice
                vrow = DGRSel.CurrentRow.Index
       End Sub

     Private Sub RMoveOne()
          'Eliminamos la Fila
                 DGRSel.Rows.RemoveAt(vrow)
          
       End Sub

    Saludos

    lunes, 17 de diciembre de 2012 21:31
  • Prueba usando el siguiente extracto de codigo:

    me.datagridview.rows.remove(me.datagridview.currentrow)

    Como ves obtiene de la coleccion de filas, la fila actual seleccionada y luego la remueve usando el  metodo remove.


    Luis Muñoz Hidalgo
    Mi Blog
    Desarrollador de Software
    Trujillo-Perú

    martes, 18 de diciembre de 2012 2:34