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)
-
VB2005 DataGridView上でクリックを無効にする方法はありますか?
Visual Basic(VBA)
-
データグリッドビューの一番最初の行に列を追加したい
Visual Basic(VBA)
-
-
4
DataGridViewのセル編集完了後に値を設定するには
Visual Basic(VBA)
-
5
DataGridViewのフォーカス遷移について
Visual Basic(VBA)
-
6
DataGridViewで指定したセルの値を取得
Visual Basic(VBA)
-
7
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
8
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
9
DatagridViewの値確定
Visual Basic(VBA)
-
10
Designer.vbは直接コードをいじってはだめ?
Visual Basic(VBA)
-
11
VB.NET DataGridView 縦スクロールバーを常に表示
Visual Basic(VBA)
-
12
DataGridViewの特定列に入力されている重複チェックをしたい
Visual Basic(VBA)
-
13
DataGridViewで入力チェック後、フォーカスをあてたい
Visual Basic(VBA)
-
14
DataGridViewのチェックボックスのON、OFFの判定方法
C言語・C++・C#
-
15
DataGridViewでyyyy/MM/dd
Visual Basic(VBA)
-
16
C# dataGridViewの値だけクリア
C言語・C++・C#
-
17
VB.NETで他のプロジェクトで作成したフォームを使う方法
Visual Basic(VBA)
-
18
Hideについて(.NET)
Visual Basic(VBA)
-
19
DataGridViewの各セル幅を自由に決め、その幅で固定したい
Visual Basic(VBA)
-
20
DataGridView 列ごとの入力制限
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
エクセルVBA 配列からセルに「...
-
VBAでユーザーフォームにセル値...
-
Excel UserForm の表示位置
-
数式バーに表示される値(文字...
-
【Excel VBA】一番右端セルまで...
-
Excel 範囲指定スクショについ...
-
エクセル、マクロで番号を読込...
-
複数指定セルの可視セルのみを...
-
エクセルVBA ダブルクリックし...
-
Excelで空白セル直前のセルデー...
-
【エクセルVBA】写真挿入の2枚...
-
【VBA】【ユーザーフォーム_Lis...
-
EXCEL VBA 文中の書式ごと複写...
-
VBA:日付を配列に入れ別セルに...
-
構造体を使用したデータの読み書き
-
「VBA」会議室予約表の作成
-
特定の色のついたセルを削除
-
Rangeの範囲指定限界
-
Excel VBAで特定の範囲の空白セ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
エクセルVBA 配列からセルに「...
-
【Excel VBA】一番右端セルまで...
-
Excel UserForm の表示位置
-
特定の色のついたセルを削除
-
Excelで空白セル直前のセルデー...
-
【VBA】【ユーザーフォーム_Lis...
-
VBA:日付を配列に入れ別セルに...
-
VBA にて、条件付き書式で背景...
-
C# DataGridViewで複数選択した...
-
入力規則のリスト選択
-
Excel VBA IF文がうまく動作し...
-
【VBA】写真の貼り付けコードが...
-
Excel 範囲指定スクショについ...
-
EXCEL VBA 文中の書式ごと複写...
-
Excel VBAでCheckboxの名前を変...
-
EXCEL 2010 VBAでピボットで複...
-
飛び地セルの空白判定
-
エクセルのカーソルを非表示に...
-
CellEnterイベント仕様について
おすすめ情報