2012-03-19 9 views
1

最初の2行は、次のとおりです。離れてクリックしてEnterキーを押して、データグリッドビューのセル編集を終了する違いは何ですか?私のDataGridViewのCellEndEditイベントの

if (dgvOptionsData.SortedColumn == null) 
      dgvOptionsData.Sort(dgvOptionsData.Columns["GroupNumber"], 0); 

のDataGridViewがデータテーブルにバインドされています。

Cellから離れてクリックしてCellEndEditイベントを入力した場合のみ、並べ替え呼び出し時にリエントラシーエラーが発生します(操作は、SetCurrentCellAddressCore関数へのリエントラントコールが発生するため有効ではありません)。私がenterを押してイベントを入力すると、このエラーは発生しません。並べ替えられた列の値を編集していても、gridviewがソートされるとエラーは発生しません。

私はCellEndEditイベントを使用していないので、このエラーはもう問題ではありませんが、何が起きているのか、理由を理解したいので、コードを再構成しました。洞察があれば教えてください。

おかげ ダン

+0

Dan、あなたのソリューションを覚えていれば、私はそれを聞くことに興味があります。私はちょうどCellEndEditイベントからCellValueChangedイベントにすべてのコードを移動することによって、この非常に解決策を解決しました。それはあなたがやったことなのでしょうか? (CellValueChangedはCellEndEditの直前で発生し、再入可能な問題を引き起こさない。) – clweeks

答えて

4

セル編集をコミットするために行うアクションには微妙な違いがあります。基本的には、クリックしてデータグリッド表示の別のセルをクリックすることを理解します。このアクションは、このようにグリッドビューによって処理される。

  • イベントハンドラ
    • 選択セル
      • (引数は、例えば、細胞(1,1)をクリックしたような)などの活性が編集コミット細胞
        • CellEndEditハンドラ(ユーザコード)
          • ソートグリッド
            • SELE (無細胞(-1、-1)の引数特別な値として)アクティブとしてCT細胞がこの方法
するため再入力のエラーをスロー

他のコントロール(データグリッドではない)をクリックすると、並べ替えが正常に機能することに注意してください。

Enterキーによる変更をコミットすると、単にCellEndEditハンドラが終了した後にselectセルがアクティブとして呼び出されます。

+0

これは非常に興味深いですが、これをどのように見つけますか?これはドキュメンテーションのどこかにありますか?それとも、デバッグして見ることができますか? – Dan

+0

例外スタックトレースを見ると、特に2回発生する 'SetCurrentCellAddressCore'と呼ばれるメソッド名が表示されます。それから私はILSpyでコードを見て、 '新しいInvalidOperationException(SR.GetString(" DataGridView_SetCurrentCellAddressCoreNotReentrant "));をスローしました。私は、このシナリオでこの行がスローされると推測します。 msdnによれば、[framewok](http://msdn.microsoft.com/en-us/library/cc667410.aspx)をデバッグする方法がありますが、私はそれを自分でやっていません。 – Rafal

0

DataGridViewは予防と無限ループするために、この例外が発生します。これは、現在アクティブなセルで操作が実行されている間にアクティブセルを変更しようとするたびに発生します。 CellEndEditイベントを入力する必要があります。ソートはセルの内容を変更し、セルの1つを編集するためです。 DataGridViewがアクティブセルを使用中にアクティブセルを変更する操作は、この例外をトリガーします。

+0

しかし、それはなぜ私が離れてクリックしたときに、私が入力を押したときに働いて説明しません。主な問題は、これら2つの違いは何か。 – Dan

関連する問題