
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 余計なお世話的な「入力規則」?対策は? 2 2023/01/14 12:39
- Excel(エクセル) 【関数】【マクロ】データの転記の方法について 2 2023/07/26 15:22
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Excel(エクセル) 現時点の年齢を算出して、その年齢と一致したセルを色付けしたい。 4 2022/06/23 17:49
- その他(Microsoft Office) EXCELでバーコードを作成すると白くなってコードが見えません 1 2022/04/04 14:24
- Excel(エクセル) ExcelVBAで自動調整できますか? 3 2023/08/25 22:59
- HTML・CSS HTMLタグのあるCSVファイルを利用する方法 4 2023/03/19 14:41
- Visual Basic(VBA) ExcelのVBAを使い、複数シートの同一箇所を、同一条件にて一括でソルバーを回す方法について 1 2022/04/23 11:49
- Visual Basic(VBA) 複数指定セルの可視セルのみを別シートに転記するVBAについて 2 2022/05/27 21:19
- Excel(エクセル) 【マクロ】ボタンを押すごとに、A1セル、A2セル、A3セルに日付を入力 3 2023/01/25 00:12
このQ&Aを見た人はこんなQ&Aも見ています
-
DataGridViewでセルクリックイベントを発生させるには
Visual Basic(VBA)
-
DataGridViewのフォーカス遷移について
Visual Basic(VBA)
-
CloseとDisposeの違い
Visual Basic(VBA)
-
-
4
DataGridViewのセル編集完了後に値を設定するには
Visual Basic(VBA)
-
5
[Visual C#] 優先される処理について
C言語・C++・C#
-
6
データグリッドビューの一番最初の行に列を追加したい
Visual Basic(VBA)
-
7
C# DataGridView のヘッダーセル中央揃え
C言語・C++・C#
-
8
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
9
グリッドビューでのチェックボックス押下時イベント
Visual Basic(VBA)
-
10
VB2005 DataGridView上でクリックを無効にする方法はありますか?
Visual Basic(VBA)
-
11
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
12
DataGridViewの特定列に入力されている重複チェックをしたい
Visual Basic(VBA)
-
13
DataGridViewで入力チェック後、フォーカスをあてたい
Visual Basic(VBA)
-
14
DataGridView 列ごとの入力制限
Visual Basic(VBA)
-
15
矢印(左右)キーでイベントを発生させたい。
Visual Basic(VBA)
-
16
Designer.vbは直接コードをいじってはだめ?
Visual Basic(VBA)
-
17
VB.NET DataGridView 縦スクロールバーを常に表示
Visual Basic(VBA)
-
18
C# ReadOnlyのTextBoxで
C言語・C++・C#
-
19
DataGridViewでyyyy/MM/dd
Visual Basic(VBA)
-
20
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA 配列からセルに「...
-
【VBA】【ユーザーフォーム_Lis...
-
Excelで空白セル直前のセルデー...
-
エクセル VBA ボタンをクリック...
-
VBAマクロ実行時エラーの修正に...
-
QRコード作成マクロについて
-
VBA:日付を配列に入れ別セルに...
-
特定の色のついたセルを削除
-
Excel VBAでCheckboxの名前を変...
-
Excel VBA 同じ処理を複数回行...
-
HTMLのテーブルのセルの値をPHP...
-
エクセル マクロ データの転記
-
DataGridViewのフォーカス遷移...
-
複数指定セルの可視セルのみを...
-
エクセルVBA 郵便番号の書式判...
-
Excel 範囲指定スクショについ...
-
データグリッドビューの結合セ...
-
DataGridViewでグリッド内に線...
-
【Excel VBA】マクロで書き込ん...
-
VBA にて、条件付き書式で背景...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
Excel UserForm の表示位置
-
特定の色のついたセルを削除
-
Excelで空白セル直前のセルデー...
-
エクセルVBA 配列からセルに「...
-
【VBA】【ユーザーフォーム_Lis...
-
VBA:日付を配列に入れ別セルに...
-
複数指定セルの可視セルのみを...
-
C# DataGridViewで複数選択した...
-
【Excel VBA】マクロで書き込ん...
-
データグリッドビューの結合セ...
-
DataGridViewのフォーカス遷移...
-
Excel 範囲指定スクショについ...
-
EXCEL VBA 文中の書式ごと複写...
-
【Excel VBA】一番右端セルまで...
-
【VBA】写真の貼り付けコードが...
-
QRコード作成マクロについて
-
入力規則のリスト選択
-
CellEnterイベント仕様について
-
エクセル、マクロで番号を読込...
おすすめ情報