Estoy usando VS 2008/C# y el enlace de una Lista local de ayudante de clases como el origen de datos para un control DataGridView. Llamar al método Remove() en mi Lista de ayudante de clases de incendios de la CellFormatting caso de que el DataGridView, lo que tiene sentido (un poco).

Cuando la eliminación de lo que pasa a ser el DataBoundItem de la última fila de la cuadrícula (tan larga como la cuadrícula tiene más de una fila), el DataGridView de la colección de Filas no se actualiza antes de este evento se desencadena. Así, en el CellFormatting controlador de eventos, tengo un IndexOutOfRangeException como la colección de Filas es demasiado grande.

He tratado de eliminar la fila utilizando el DataGridView.Las filas.Método Remove (), y la unión mediante un BindingSource en lugar de enlazar a la Lista directamente como fuente de datos.

He encontrado algunas referencias a esta ocurrencia a través de Google, pero las respuestas no fueron próxima o dice que el uso de Delete() método en el DataGridView o el DataGridView.Colección de filas de ninguno de los que existen en la actualidad.

Clasificación no parece ser el problema, como de realizar y no realizar una especie de resultados en el mismo resultado.

La única excepción a la “última fila” de ser un problema para la eliminación es si el DataGridView contiene sólo una fila – en cuyo caso todo funciona bien.

OriginalEl autor C B | 2008-10-07

6 Comentarios

  1. 10

    He tenido este problema en el pasado, y si no recuerdo mal hay una de dos cosas que usted puede hacer. Cuando se quita el registro de la colección, establezca la propiedad datasource en el datagridview a null, y, a continuación, volver a enlazar a la lista. Que debe hacer el truco.

    Alternativamente, usted puede manejar la DataError evento en el dataGridview y en el método que se puede decir e.Cancel = true para suprimir la excepción, o se puede tratar con él allí.

    valor a null y regresar a la colección trabajado.
    Marcar esta como la exceptuados de respuesta en un viejo loco que se trate. 🙂 Yo creo que he probado la sugerencia sin éxito en el momento. Pero parece que han funcionado para otros.

    OriginalEl autor BFree

  2. 2

    Para ocultar la última fila, cambiar el AllowUserToAddRows propiedad de la datagridview como se muestra:

    myDataGridView1.AllowUserToAddRows = false

    OriginalEl autor Asad Naeem

  3. 2

    Primera sólo tiene que desactivar la propiedad de Datagridview como

    dataGridView1.AllowUserToAddRows = false;

    y, a continuación, sólo hay que quitar la última filas como tantas filas como usted desee, ya sea con el bucle for, manteniendo -1.

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

    OriginalEl autor Abdul Jabbar Dumrai

  4. 0

    Es un problema muy antiguo, pero lo resuelto por la manipulación de la fila-quitar evento, de la siguiente manera.

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

    y funcionó.

    OriginalEl autor inam101

  5. 0

    Sé que esto es una vieja pregunta, pero he encontrado otra solución que funcionó para mí. Antes de eliminar el elemento de los datos de origen /origen de enlace, onu-cablear el controlador de eventos para el CellFormatting evento y, a continuación, volver a conectar después. Por ejemplo:

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

    OriginalEl autor DCNYAM

  6. 0

    Tengo el mismo problema. He encontrado una solución. Intente copiar todas las filas a la fila siguiente. a continuación, retire la primera fila de la 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)

    probarlo:)

    OriginalEl autor Caravansary

Dejar respuesta

Please enter your comment!
Please enter your name here