Удалить Последнюю Строку Databound DataGridView C#
Я использую VS 2008/C# и привязываю локальный список вспомогательных классов в качестве источника данных для элемента управления DataGridView. Вызов метода Remove () в моем списке вспомогательных классов запускает событие CellFormatting DataGridView, что имеет смысл (немного).
При удалении любого элемента DataBoundItem последней строки в сетке (если сетка содержит более одной строки) коллекция строк DataGridView не обновляется до возникновения этого события. Итак, в CellFormatting обработчик событий, я получаю IndexOutOfRangeException, так как коллекция строк слишком велика.
Я попытался удалить строку с помощью DataGridView.Строки.Метод Remove () и привязка с использованием BindingSource вместо привязки списка непосредственно в качестве источника данных.
Я нашел несколько ссылок на это явление через Google, но ответы либо не были получены, либо говорилось, что используется метод Delete() либо в DataGridView, либо в DataGridView.Коллекция строк - ни одна из которых в настоящее время существовать.
Сортировка также не является проблемой, поскольку выполнение/невыполнение сортировки приводит к тому же результату.
Единственным исключением из "последней строки", являющейся проблемой для удаления, является то, что DataGridView содержит только одну строку - в этом случае все работает нормально.
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