web-dev-qa-db-fra.com

Pourquoi mon DataGridView lié génère-t-il une erreur "Opération non valide car elle entraîne un appel réentrant à la fonction SetCurrentCellAddressCore"?

Lorsque je lie un contrôle DataGridView à une source de liaison, l'erreur suivante s'affiche dans mon application:

L'opération n'est pas valide car elle entraîne un appel réentrant à la fonction SetCurrentCellAddressCore.

La source de liaison dépend de la table de données. Et je filtre les enregistrements de DataGridView. Et j'ai utilisé l'événement dataGridView1_CellValueChanged() pour filtrer le DataGridView. Mais lorsque je supprimais les données de la cellule en cours, cette erreur se produisait.

Comment puis-je résoudre ce problème?

22
priyanka

L’exception est déclenchée par la variable DataGridView afin d’empêcher l’apparition d’une boucle infinie. La cause en est généralement l'une des suivantes:

  • Changer la cellule active lorsqu'une opération est en cours sur la cellule actuellement active
  • Commencer, terminer ou annuler le mode édition lorsqu'une cellule est déjà en cours d'édition
  • Toute autre opération entraînant la modification de la cellule active pendant que la DataGridView l'utilise encore

Examinez votre gestionnaire pour l'événement CellValueChanged et assurez-vous que vous ne faites rien de ce qui est décrit ci-dessus dans le gestionnaire.

29
Bradley Smith

Cela est probablement dû à votre tentative d'actualisation d'un DataGridView après une sauvegarde. Je vous suggère d'appeler la méthode plutôt que de simplement l'appeler.

   BeginInvoke(new MethodInvoker(PopulateControl ));
26
CouncilScribe

J'ai trouvé cette exception parce que j'avais un sous-fichier DataGridView.CellValidated vide dans mon code. Une fois que j'ai supprimé ce sous vide, l'erreur est partie.

2
Mike Banach

Ceci est très similaire (et pourrait être la même chose mais sans éditer une cellule). Tout ce qui est fait à un datagridview en dehors du même thread que celui où le contrôle existe (événement, ouvrier d'arrière-plan, autre thread ...) doit être appelé. Lisez la solution ici.

https://stackoverflow.com/questions/44456465/datagridview-invalidoperationexception-reentrant-call-to-setcurrentcelladdressco?noredirect=1#comment75919793_44456465
0
DaBlue

Définissez False sur MultiSelect Propriété de votre datagridview.

myDataGridView.MultiSelect=false;
0
Said Ait

Cela peut être dû à la manipulation de la source de données alors que DataGridview est dans BeginEdit.

Une autre solution consiste à SuspendBinding sur la CurrencyManager de la DataGridView lors de la manipulation de la source de données.

CurrencyManager currencyManager = (CurrencyManager)BindingContext[dataGridView1.DataSource];
currencyManager.SuspendBinding();
// Manipulate datasource
currencyManager.ResumeBinding();
0
clamchoda