Почему моя связанная DataGridView выдает ошибку «Операция недопустима, поскольку она приводит к повторному входу в функцию SetCurrentCellAddressCore»? - PullRequest
24 голосов
/ 25 февраля 2011

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

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

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

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

Ответы [ 7 ]

29 голосов
/ 25 февраля 2011

Исключение возбуждается DataGridView для предотвращения возникновения бесконечного цикла. Причина этого обычно одна из следующих:

  • Изменение активной ячейки во время выполнения операции с активной в данный момент ячейкой
  • Начало, окончание или отмена режима редактирования, когда редактирование ячейки уже выполняется
  • Любая другая операция, которая приводит к изменению активной ячейки, пока DataGridView все еще использует ее

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

28 голосов
/ 24 ноября 2011

Скорее всего, это вызвано тем, что вы пытаетесь обновить DataGridView после сохранения.Я предлагаю вам вызывать метод, а не просто вызывать его.

   BeginInvoke(new MethodInvoker(PopulateControl ));
2 голосов
/ 22 апреля 2013

Я обнаружил, что это исключение произошло, потому что в моем коде была пустая подпрограмма DataGridView.CellValidated.Как только я удалил этот пустой саб, ошибка исчезла.

0 голосов
/ 23 января 2019

Установите False в MultiSelect Свойство вашей таблицы данных.

myDataGridView.MultiSelect=false;
0 голосов
/ 12 ноября 2018

Это может быть вызвано манипулированием источником данных, когда DataGridview находится в BeginEdit.

Другое решение - SuspendBinding на CurrencyManager DataGridView при манипулировании источником данных.

CurrencyManager currencyManager = (CurrencyManager)BindingContext[dataGridView1.DataSource];
currencyManager.SuspendBinding();
// Manipulate datasource
currencyManager.ResumeBinding();
0 голосов
/ 09 июня 2017

Это очень похоже (и может быть тем же самым, но без редактирования ячейки).Все, что сделано с сеткой данных вне того же потока, в котором существует элемент управления (событие, фоновый работник, другой поток ...), должно быть вызвано.Читайте о решении здесь.

https://stackoverflow.com/questions/44456465/datagridview-invalidoperationexception-reentrant-call-to-setcurrentcelladdressco?noredirect=1#comment75919793_44456465
0 голосов
/ 05 декабря 2015

Помещение Application.DoEvents () в dataGridView.RowEnter может сделать это тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...