Почему мой связанный DataGridView бросает "Операцию недействительной, потому что она приводит к повторному вызову функции SetCurrentCellAddressCore"?
При привязке элемента управления DataGridView
к источнику привязки я получаю следующую ошибку в своем приложении:
Операция недействительна, поскольку она приводит к повторному вызову функции SetCurrentCellAddressCore
Источник привязки зависит от таблицы данных. И я фильтрую записи из DataGridView. И я использовал событие dataGridView1_CellValueChanged()
, где я фильтрую DataGridView. Но когда я удалял данные из текущей ячейки, эта ошибка возникает.
Как я могу решить эту проблему?
Ответы
Ответ 1
Исключение возникает с помощью DataGridView
, чтобы предотвратить возникновение бесконечного цикла. Причиной этого обычно является одно из следующих:
- Изменение активной ячейки во время выполнения операции в активной ячейке
- Начало, окончание или отмена режима редактирования, когда редактирование ячейки уже выполнено.
- Любая другая операция, которая приводит к изменению активной ячейки, пока
DataGridView
все еще использует ее
Посмотрите на свой обработчик для события CellValueChanged
и убедитесь, что вы не выполняете никаких действий в обработчике.
Ответ 2
Это, скорее всего, вызвано попыткой обновить DataGridView после сохранения.
Я предлагаю вам вызывать метод, а не просто его называть.
BeginInvoke(new MethodInvoker(PopulateControl ));
Ответ 3
Я обнаружил, что это исключение произошло, потому что у меня в моем коде был пустой элемент DataGridView.CellValidated. Как только я удалил этот пустой элемент, ошибка исчезла.
Ответ 4
Это очень похоже (и может быть одним и тем же, но без редактирования ячейки). Все, что делается для datagridview вне того же потока, что и элемент управления (событие, рабочий стол, другой поток...), нужно вызвать. Прочитайте здесь решение.
https://stackoverflow.com/questions/44456465/datagridview-invalidoperationexception-reentrant-call-to-setcurrentcelladdressco?noredirect=1#comment75919793_44456465
Ответ 5
Это может быть вызвано манипулированием источником данных, когда DataGridview
находится в BeginEdit
.
Другим решением является SuspendBinding
к CurrencyManager
объекта DataGridView
при манипулировании источником данных.
CurrencyManager currencyManager = (CurrencyManager)BindingContext[dataGridView1.DataSource];
currencyManager.SuspendBinding();
// Manipulate datasource
currencyManager.ResumeBinding();
Ответ 6
Установите False в MultiSelect Property для вашей таблицы данных.
myDataGridView.MultiSelect=false;
Ответ 7
Поместите Application.DoEvents() в dataGridView.RowEnter тоже можно сделать.