web-dev-qa-db-ja.com

バインドされたDataGridViewが「SetCurrentCellAddressCore関数へのリエントラント呼び出しが発生するため、操作が無効です」というエラーをスローするのはなぜですか?

DataGridViewコントロールをバインディングソースにバインドすると、アプリケーションで次のエラーが発生します。

SetCurrentCellAddressCore関数へのリエントラント呼び出しが発生するため、操作は無効です

バインディングソースはデータテーブルによって異なります。そして、DataGridViewからレコードをフィルタリングしています。そして、DataGridViewをフィルタリングしているdataGridView1_CellValueChanged()イベントを使用しました。しかし、現在のセルからデータを削除すると、このエラーが発生します。

この問題を解決するにはどうすればよいですか?

27
priyanka

例外は、無限ループの発生を防ぐためにDataGridViewによって発生します。この原因は通常、次のいずれかです。

  • 現在アクティブなセルで操作が実行されている間にアクティブセルを変更する
  • セルの編集がすでに進行中のときの編集モードの開始、終了、またはキャンセル
  • DataGridViewがまだ使用しているときにアクティブセルが変更されるその他の操作

CellValueChangedイベントのハンドラーを調べて、ハンドラー内で上記のいずれも実行していないことを確認してください。

31
Bradley Smith

これはおそらく、保存後にDataGridViewを更新しようとしたことが原因です。メソッドを呼び出すだけでなく、メソッドを呼び出すことをお勧めします。

   BeginInvoke(new MethodInvoker(PopulateControl ));
28
CouncilScribe

コードに空のDataGridView.CellValidatedサブルーチンがあるため、この例外が発生したことがわかりました。その空のサブを削除すると、エラーはなくなりました。

2
Mike Banach

FalseをデータグリッドビューのMultiSelectプロパティに設定します。

myDataGridView.MultiSelect=false;
1
Said Ait

これは非常によく似ています(同じことをすることができますが、セルを編集する必要はありません)。コントロールが存在するのと同じスレッド(イベント、バックグラウンドワーカー、別のスレッド...)の外部のdatagridviewに対して行われた処理はすべて呼び出す必要があります。ここで解決策を読んでください。

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

これは、DataGridviewBeginEditにあるときにデータソースを操作することで発生する可能性があります。

別の解決策は、データソースを操作しながらSuspendBindingCurrencyManagerDataGridViewすることです。

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