• 締切済み

CellEnterイベント仕様について

DataGridViewのCellEnterの仕様で下記の仕様がありますが、 「コントロールに入力フォーカスがなく、クリックされたセルが以前に現在のセルではなかった場合、 このイベントが 1 回のクリックに対して 2 回発生することがあります。」 この件で困っています。 2回イベントが発生する場合は、下記のような動作になっています。 1回目:前回セル位置情報でイベントが発生 2回目:今回セル位置情報でイベントが発生 また、1回のみの発生の場合は、 1回目:今回セル位置情報でイベントが発生。 となっています。 このイベントで、 前回のセル情報で発生したのか、今回のセル情報で発生したのか 区別したいのですが よい方法はありませんか? 現状は、Enterイベントでフラグを立てて 「コントロールに入力フォーカスがなく」の条件は判断できていますが、 「クリックされたセルが以前に現在のセルではなかった場合」を判断する方法が 分からない状態です。 よろしくお願いします。

みんなの回答

回答No.2

>現在のCurrentCellが最新のCurrentCellになっている事が必要となっています。 >CurrentCellが前回位置のまま、イベント発生させるのは避けなければなりません。 ということからすると、 「一回目の CellEnter 発生時は、CurrentCell の内容が古い」 とお考えのようですが、開発側 ( Microsoft ) の意図としては、 「一回目の CellEnter 発生時点では、セルの現在位置はまだ移動しておらず、各 CellEnter 発生時の CurrentCell は正しい値である」 ということだと思います。 例えば、1行目1列目が現在位置の状態で、かつ、フォーカスは他のコントロールにある状態で、 1行目2列目をクリックすると (A-1) DataGridView 全体に対しての Enter が発生 ↓ (A-2) 1行目1列目のセルに対して CellEnter が発生 ( この時点ではまだ CurrentCell は移動していない ) ↓ (A-3) 1行目1列目のセルに対して CellLeave が発生 ↓ (A-4) CurrentCellChanged が発生 ( ここでようやく CurrentCell が移動 ) ↓ (A-5) 1行目2列目のセルに対して CellEnter が発生 ↓ (A-6) 1行目2列目の CellClick が発生 となるようです。 また、1回目の CellEnter 発生時点では、CellClick や Click などのイベントはまだ発生していないので、 1回目の CellEnter 発生時点では次にどのセルに移動するを取得することはできません。 つまり、 1行目1列目が現在位置の状態で、かつ、フォーカスは他のコントロールにある状態で、 タブキーを押して DataGridView にフォーカスを移動 ↓ (B-1) DataGridView 全体に対しての Enter が発生 ↓ (B-2) 1行目1列目のセルに対して CellEnter が発生 ( A-2 に相当 ) となった時点では、別のセルがクリックされるのか、プログラム終了まで別のセルがクリックされることはないのかはわからない のと同じと考えるしかなさそうです。

akanekor
質問者

お礼

マイクロソフトの意図はともかく、 こちらは、無理にでも実装するしか無いんですけどね(TーT もう、まともな方法では無理と判断し 無理矢理作成しました。 (1)EnterのタイミングでMOUSEボタンが押下されているか判断 (マウスで無い場合、TAB移動もしくはプログラムによるアクティブ化と判断) →マウスの場合、一回か二回の判断が出来ないため、   CellEnter,MouseUp,MouseLeaveイベントの組み合わせで対処。 →Tab移動は元セルに戻るので、イベント一回と判断。  CellEnterに来た時点で即イベント発生させる。 (2)CurrentCellをオーバーライドし、プログラム的にカレント変更された場合に対処。 何か別途バグが発生しそうな気がしますが、一応、動作しています。 なので、未解決ですが、打ち切ります。 回答ありがとうございました。(-▽-ノ

回答No.1

(1)コントロールに入力フォーカスがない状態で現在位置のセルをクリック ↓ 現在位置に対してCellEnterが発生 (2)コントロールに入力フォーカスがある状態で現在位置を移動 ↓ 移動前のセルに対してCellLeaveが発生 ↓ 移動後のセルに対してCellEnterが発生 のようになると思いますが、この場合、(1)のCellEnterと(2)のCellEnterとで実行する処理内容が異なりますか? 一回のクリックでCellEnterが二回発生する場合というのは上の(1)と(2)が連続して発生しているだけなので、もし、(1)のCellEnterと(2)のCellEnterを区別する必要がないのであれば、一回のクリックでCellEnterが二回発生する場合も区別する必要がないんじゃないな、とか思えるのですがどうなんでしょう? (1)と(2)を区別しなければならないのなら、CurrentCellChangedか何か他のイベントに変更しなければならないかもしれないですね。

akanekor
質問者

補足

回答ありがとうございます。 現在行いたい事は、 CellEnterイベントで、自分で用意したイベントを発生させることです。 その際の条件として、 イベント発生タイミングで 現在のCurrentCellが最新のCurrentCellになっている事が必要となっています。 今回問題となるのは、2回イベントが発生する際にCurrentCellがこちらの意図した物と異なっており 一回目、CurrentCellは変更前のCurrentCell位置にあり 二回目に最新のCurrentCellになります。 2回自分で用意したイベントを発生させてもいいのですが、 CurrentCellが前回位置のまま、イベント発生させるのは避けなければなりません。 そのために、このような質問を上げています。 CurrentCellChangedの件ですが、 カレントセル変更が無いとイベントが発生しないので、 今回の件には使えませんでした。 また、 発生タイミングがCellEnterの後の為フラグ立てにもダメです。 (><

関連するQ&A