#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