Principales respuestas
Eliminar fila vacía en DatagridView.

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?
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 SubPuede que ya lo hayas solucionado, pero al menos espero que a alguien le pueda resultar de ayuda.
Un saludo.
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 Subsaludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
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.
-
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 comillasademas tienes ese campo en la grilla ?
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
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 SubPuede que ya lo hayas solucionado, pero al menos espero que a alguien le pueda resultar de ayuda.
Un saludo.
-
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();
-
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.
-
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 SubSaludos
-
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ú