Удалить Последнюю Строку Databound DataGridView C#



Я использую VS 2008/C# и привязываю локальный список вспомогательных классов в качестве источника данных для элемента управления DataGridView. Вызов метода Remove () в моем списке вспомогательных классов запускает событие CellFormatting DataGridView, что имеет смысл (немного).



При удалении любого элемента DataBoundItem последней строки в сетке (если сетка содержит более одной строки) коллекция строк DataGridView не обновляется до возникновения этого события. Итак, в CellFormatting обработчик событий, я получаю IndexOutOfRangeException, так как коллекция строк слишком велика.



Я попытался удалить строку с помощью DataGridView.Строки.Метод Remove () и привязка с использованием BindingSource вместо привязки списка непосредственно в качестве источника данных.



Я нашел несколько ссылок на это явление через Google, но ответы либо не были получены, либо говорилось, что используется метод Delete() либо в DataGridView, либо в DataGridView.Коллекция строк - ни одна из которых в настоящее время существовать.



Сортировка также не является проблемой, поскольку выполнение/невыполнение сортировки приводит к тому же результату.



Единственным исключением из "последней строки", являющейся проблемой для удаления, является то, что DataGridView содержит только одну строку - в этом случае все работает нормально.

980   6  

6 ответов:

У меня была такая проблема в прошлом, и если я правильно помню, есть одна из двух вещей, которые вы можете сделать. При удалении записи из коллекции задайте свойству datasource в datagridview значение null, а затем повторно свяжите его со списком. Это должно сработать.

В качестве альтернативы, вы можете обработать событие DataError в своем dataGridview и в методе вы можете сказать e. Cancel = true, чтобы подавить исключение, или вы можете продолжить работу с ним там.

Чтобы скрыть последнюю строку, измените свойство AllowUserToAddRows представления datagridview следующим образом:

myDataGridView1.AllowUserToAddRows = false

Сначала просто отключите свойство Datagridview как

dataGridView1.AllowUserToAddRows = false;

А затем просто удалите последние строки столько строк, сколько вы хотите либо с циклом for, сохраняя -1.

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

Это очень старая проблема, но я решил ее, обработав событие Row-remove следующим образом.

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

И это сработало.

Я знаю, что это старый вопрос, но я нашел другое решение, которое сработало для меня. Перед удалением элемента из источника данных / источника привязки отключите обработчик событий для события CellFormatting, а затем повторно подключите его. Например:

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

У меня та же проблема. Я нашел решение. Попробуйте скопировать все строки в следующую строку. затем удалите первый ряд dgv. Пример кода для этого:

    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)

Попробуйте:)

Comments

    Ничего не найдено.