
DataGridViewのCellEnterの仕様で下記の仕様がありますが、
「コントロールに入力フォーカスがなく、クリックされたセルが以前に現在のセルではなかった場合、
このイベントが 1 回のクリックに対して 2 回発生することがあります。」
この件で困っています。
2回イベントが発生する場合は、下記のような動作になっています。
1回目:前回セル位置情報でイベントが発生
2回目:今回セル位置情報でイベントが発生
また、1回のみの発生の場合は、
1回目:今回セル位置情報でイベントが発生。
となっています。
このイベントで、
前回のセル情報で発生したのか、今回のセル情報で発生したのか
区別したいのですが
よい方法はありませんか?
現状は、Enterイベントでフラグを立てて
「コントロールに入力フォーカスがなく」の条件は判断できていますが、
「クリックされたセルが以前に現在のセルではなかった場合」を判断する方法が
分からない状態です。
よろしくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
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 に相当 )
となった時点では、別のセルがクリックされるのか、プログラム終了まで別のセルがクリックされることはないのかはわからない
のと同じと考えるしかなさそうです。
マイクロソフトの意図はともかく、
こちらは、無理にでも実装するしか無いんですけどね(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か何か他のイベントに変更しなければならないかもしれないですね。
この回答への補足
回答ありがとうございます。
現在行いたい事は、
CellEnterイベントで、自分で用意したイベントを発生させることです。
その際の条件として、
イベント発生タイミングで
現在のCurrentCellが最新のCurrentCellになっている事が必要となっています。
今回問題となるのは、2回イベントが発生する際にCurrentCellがこちらの意図した物と異なっており
一回目、CurrentCellは変更前のCurrentCell位置にあり
二回目に最新のCurrentCellになります。
2回自分で用意したイベントを発生させてもいいのですが、
CurrentCellが前回位置のまま、イベント発生させるのは避けなければなりません。
そのために、このような質問を上げています。
CurrentCellChangedの件ですが、
カレントセル変更が無いとイベントが発生しないので、
今回の件には使えませんでした。
また、
発生タイミングがCellEnterの後の為フラグ立てにもダメです。
(><
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
DataGridViewでセルクリックイベントを発生させるには
Visual Basic(VBA)
-
DataGridViewのフォーカス遷移について
Visual Basic(VBA)
-
CloseとDisposeの違い
Visual Basic(VBA)
-
-
4
[Visual C#] 優先される処理について
C言語・C++・C#
-
5
C# DataGridView のヘッダーセル中央揃え
C言語・C++・C#
-
6
データグリッドビューの一番最初の行に列を追加したい
Visual Basic(VBA)
-
7
グリッドビューでのチェックボックス押下時イベント
Visual Basic(VBA)
-
8
DataGridViewのセル編集完了後に値を設定するには
Visual Basic(VBA)
-
9
VB2005 DataGridView上でクリックを無効にする方法はありますか?
Visual Basic(VBA)
-
10
VB.NET DataGridView 縦スクロールバーを常に表示
Visual Basic(VBA)
-
11
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
12
DataGridViewの、選択されている行を取り出したい
Visual Basic(VBA)
-
13
DataGridViewで入力チェック後、フォーカスをあてたい
Visual Basic(VBA)
-
14
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
15
コンボボックスのマウスホイールを無効にしたい
Visual Basic(VBA)
-
16
DataGrdViewに関連付けたデータの更新
C言語・C++・C#
-
17
Loadイベント中にほかのイベントを発生したくない
その他(プログラミング・Web制作)
-
18
System.IO.Directory.GetFilesの順番
Visual Basic(VBA)
-
19
【VB】タブ切り替え時のイベント
Visual Basic(VBA)
-
20
DataGridViewの特定列に入力されている重複チェックをしたい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel UserForm の表示位置
-
VBAマクロ実行時エラーの修正に...
-
【VBA】【ユーザーフォーム_Lis...
-
[Excel VBA] このコードでは行...
-
オーバーフローを回避する方法?
-
入力規則のリスト選択
-
エクセルのカーソルを非表示に...
-
VBAについて
-
エクセル VBA ボタンをクリック...
-
C# DataGridViewで複数選択した...
-
QRコード作成マクロについて
-
エクセル、マクロで番号を読込...
-
VBAを用いた散布図グラフの線種...
-
Rangeの範囲指定限界
-
Excel 範囲指定スクショについ...
-
【VBA】写真の貼り付けコードが...
-
Excelで空白セル直前のセルデー...
-
Excel VBAで特定の範囲の空白セ...
-
VBAのソースコードについて
-
【ExcelVBA】値を変更しながら...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel UserForm の表示位置
-
VBAマクロ実行時エラーの修正に...
-
特定の色のついたセルを削除
-
Excelで空白セル直前のセルデー...
-
エクセルVBA 配列からセルに「...
-
【VBA】【ユーザーフォーム_Lis...
-
【VBA】写真の貼り付けコードが...
-
データグリッドビューの結合セ...
-
複数指定セルの可視セルのみを...
-
エクセル、マクロで番号を読込...
-
CellEnterイベント仕様について
-
C# DataGridViewで複数選択した...
-
【ExcelVBA】値を変更しながら...
-
EXCEL VBA 文中の書式ごと複写...
-
マクロ初心者です。 マクロで範...
-
【Excel VBA】一番右端セルまで...
-
【Excel VBA】マクロで書き込ん...
-
VBA:日付を配列に入れ別セルに...
-
DataGridViewでグリッド内に線...
-
DataGridViewのフォーカス遷移...
おすすめ情報