2008-10-07 35 views
5

Estoy usando VS 2008/C# y vinculando una lista local de clases de ayuda como el DataSource para un control DataGridView. Llamar al método Remove() en mi lista de clases de ayudante desencadena el evento CellFormatting de DataGridView, que tiene sentido (un poco).Eliminar última fila Databound DataGridView C#

Al eliminar lo que sea DataBoundItem de la última fila de la grilla (siempre que la grilla tenga más de una fila), la colección Filas de DataGridView no se actualiza antes de que se desate este evento. Por lo tanto, en el controlador de eventos CellFormatting, obtengo una excepción IndexOutOfRangeException porque la colección Filas es demasiado grande.

He intentado eliminar la fila utilizando el método DataGridView.Rows.Remove(), y el enlace utilizando un BindingSource en lugar de enlazar la Lista directamente como fuente de datos.

Encontré algunas referencias a esta ocurrencia a través de Google, pero las respuestas no aparecían o decían que usaban un método Delete() en la colección DataGridView o DataGridView.Rows, ninguna de las cuales existe actualmente.

La ordenación tampoco parece ser el problema, ya que realizar/no realizar una clasificación da como resultado el mismo resultado.

La única excepción a la "última fila" que es un problema para la eliminación es si el DataGridView contiene solo una fila, en cuyo caso todo funciona correctamente.

Respuesta

10

He tenido este problema en el pasado, y si mal no recuerdo hay una de dos cosas que puede hacer. Cuando elimina el registro de la colección, establezca la propiedad de fuente de datos en su vista de tabla de datos en nulo, y luego vuelva a vincularla a su lista. Eso debería hacer el truco.

Como alternativa, puede manejar el evento DataError en su dataGridview y en el método puede decir e.Cancel = true para suprimir la excepción, o puede tratarlo allí.

+0

configuración para anular y volver a la colección trabajada. – Pat

+0

Marcando esto como la respuesta exceptuada en una vieja y loca pregunta. :-) Creo que probé la sugerencia sin éxito en ese momento. Pero parece haber funcionado para otros. –

0

Es un problema muy viejo, pero lo resolví manejando el evento row-remove, de la siguiente manera.

private void dgViewItems_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e) 
{ 
    dataAdapter.Update((DataTable)bindingSource1.DataSource); 
} 

y funcionó.

0

Sé que esta es una vieja pregunta, pero encontré otra solución que funcionó para mí. Antes de eliminar el elemento de la fuente de datos/fuente de enlace, desentierre el controlador de eventos para el evento CellFormatting y luego vuelva a conectarlo. Por ejemplo:

RemoveHandler DataGridView1.CellFormatting, AddressOf DataGridView1_CellFormatting 
Me.BindingSource1.Remove(item) 
AddHandler DataGridView1.CellFormatting, AddressOf DataGridView1_CellFormatting 
0

Tengo el mismo problema. He encontrado una solución. Intenta copiar todas las filas a la siguiente fila. luego remueva la primera fila de dgv. Un código de ejemplo para esto:

If Dgv.CurrentCell.RowIndex + 1 = Dgv.Rows.Count Then 
     For m = Dgv.Rows.Count - 2 To 0 Step -1 
      Dgv.Rows(m + 1).Cells(0).Value = Dgv.Rows(m).Cells(0).Value 
      Dgv.Rows(m + 1).Cells(1).Value = Dgv.Rows(m).Cells(1).Value 
      Dgv.Rows(m + 1).Cells(2).Value = Dgv.Rows(m).Cells(2).Value 
      Dgv.Rows(m + 1).Cells(3).Value = Dgv.Rows(m).Cells(3).Value 

     Next 
     Dgv.Rows.RemoveAt(0) 
     Exit Sub 
    End If 
    Dgv.Rows.Remove(Dgv.CurrentRow) 

intentarlo :)

2

Para ocultar la última fila, cambie la propiedad AllowUserToAddRows del DataGridView como se muestra:

myDataGridView1.AllowUserToAddRows = false 
1

Primera simplemente desactivar la propiedad de Datagridview como

dataGridView1.AllowUserToAddRows = false; 

y luego simplemente eliminar las últimas filas tantas filas como desee e ither con for loop manteniendo -1.

dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1); 
dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1); 
Cuestiones relacionadas