Подтвердить что ты не робот

Почему мой связанный DataGridView бросает "Операцию недействительной, потому что она приводит к повторному вызову функции SetCurrentCellAddressCore"?

При привязке элемента управления DataGridView к источнику привязки я получаю следующую ошибку в своем приложении:

Операция недействительна, поскольку она приводит к повторному вызову функции SetCurrentCellAddressCore

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

Как я могу решить эту проблему?

4b9b3361

Ответ 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 тоже можно сделать.