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

#c# #datagridview

Вопрос:

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

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

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

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

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

Единственным исключением из того, что «последняя строка» является проблемой для удаления, является то, что представление DataGrid содержит только одну строку — в этом случае все работает нормально.

Ответ №1:

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

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

Комментарии:

1. Отмечаю это как исключенный ответ на безумный старый вопрос. 🙂 Я полагаю, что в то время я попробовал это предложение, но безуспешно. Но, похоже, это сработало и для других.

Ответ №2:

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

 dataGridView1.AllowUserToAddRows = false;
 

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

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

Ответ №3:

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

 myDataGridView1.AllowUserToAddRows = false
 

Ответ №4:

У меня та же проблема. Я нашел решение. Попробуйте скопировать все строки в следующую строку. затем удалите первый ряд 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)
 

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

Ответ №5:

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

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

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

Ответ №6:

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

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