• 締切済み

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

  • コマンドボタンのEnterイベント後に、フォーカスを移動したい。

    コマンドボタンのEnterイベント後に、フォーカスを移動したい。 フォームに「TextBox1」(TabIndex=0)「TextBox2」(TabIndex=1)「CommandButton1」(TabIndex=2)の3つのコントロールがある場合。 CommandButton1がクリックされた場合も、TextBox2からCommandButton1に、タブキーまたはエンターキーで、フォーカスが移った場合にも、同じ処理を行い、処理結果によってTextBox1やTextBox2にフォーカスを移したいと考えています。 以下のようなサンプルを作成しました。 Private Sub CommandButton1_Enter() CommandButton1_Click End Sub Private Sub CommandButton1_Click() MsgBox ("OK") TextBox2.SetFocus End Sub この場合、CommandButton1_Enterのイベントが起こった場合、CommandButton1_Click()のTextBox2.SetFocusは効きません。 (正確には、CommandButton1_Enterイベントが終わった時点で無効でしょうか。) Enterイベントは、フォーカスが移動する前に発生するため、このイベントが終わった後に、そもそもの動作に戻り、フォーカス移動が発生してしまうからなのだと思っております。 要は、コマンドボタンにタブキーやエンターキーでフォーカスしても、コマンドボタンをクリックしたのと同じ処理を行い、所定の位置にフォーカスを持っていきたいのですが、どのように行えば良いか、わからない状況です。 よろしくお願いいたします。

  • ラインコントロールにクリックイベント

    ラインコントロールにイベントが発生しないことは分かっています。 なので、自作しないといけないのかなと思っていますが、良い方法が見つかりません。クリックイベントが発生するようなラインのユーザーコントロールの作り方を教えていただけませんか? あるいは、フォームのクリックイベントで、そこがラインコントロール上か否かという判断をさせる方法でもいいです。 よろしくお願いします。

  • SPREADコマンドボタン発生イベントについて

    突然申し訳ありませんが質問させてください。 SPREAD3.0の先頭列にコマンドボタンをデザインし、 (行数分ボタンが存在する。)動作させたのですが、 クリック対象ボタンにフォーカスがすでに移動して いた場合にクリックイベントが発生しませんでした。 他の、ボタンやセルにフォーカスを移動させ再度 クリックするとイベント発生します。 これは、スプレッドに対する設定のせいなので しょうか? それとも、バグなのでしょうか?もし、バグであれば 対策法があればご教授願います。 よろしくお願いします。

  • テキストボックスの項目チェックをする場合どのイベントで?

    テキストボックスの入力内容が妥当か判断する場合はどのイベントで行いますか? 理想はチェックをしてエラーであれば、別のコントロールにフォーカスを移動させずに、現在のテキストボックスにフォーカスがある状態にしたいのです。 ACCESSのBeforeUpdateのようにキャンセルもでき、別のコントロールにフォーカスが移らずチェックするにはどのイベントでチェックすればよいですか?

  • シートのクリックイベントは拾えないのか?

    ExcelのVBAに関する質問です。 さきほど「セルをクリック、またはダブルクリックしたときに○○したい」という質問に回答したのですが、「セルをクリックした」というイベントを拾う方法がわからず、ダブルクリックのパターンで回答しました。 Worksheetのイベントには BeforeDobuleClick や BeforeRightClick はあるのに Click や onClick というイベントがありません。オートシェイプなどのオブジェクトやフォーム上のオブジェクトには Click イベントがあるのですが、Worksheet になぜかありません。 これまでも同様のケースがあり、ネットで検索したりしたのですが、どれも SelectionChange で代用するものでした。それだと確かにマウスで別セルを選択したときにイベントが発生しますが、 ・キーボード操作でセルを移動してもイベントが発生する ・現在選択しているセルをクリックしてもイベントが発生しない と、厳密はマウスでクリックしたときと同じ動作になりません。 確か以前の質問で「あるセルをクリックするたびに、他のセルの値をカウントアップしたい」というようなものもありました。このような場合には、やはり Click に相当するようなイベントで処理したいです。 どうにかしてWorksheetでクリックイベントを拾うことはできないのでしょうか?

  • VBAでのコントロールイベント処理

    VBAで画面を作成しています。 「form1」からボタンを押下することで「form2」がモーダルで表示される仕様です。 「form2」からListのコントロールをダブルクリックすることで 「form2」は閉じ、「form1」に選択した内容を表示するという仕様です。 その場合、「form1」の別のイベントがなぜか走ってしまいます。 どのような処理をおこなえば、「form1」のイベントが発生しないようなるでしょうか??

  • イベントが発生しません・・・

    Excel VBAでの質問です。 フォーム上にコントロールはTextBox1つしかありません。 商品コードを入力させ、入力値より商品データを検索、編集させようと思います。 コードを入力しエンターキーを押しても、フォーカスの移動場所が無いためかExitイベントが発生しません。 閉じるボタン[×]でフォームを閉じると、Exitイベントは発生するようです。 入力後はフォームは閉じてもかまいませんが、イベントを発生させることはできるでしょうか。 どなたか教えてください。

  • comboboxのクリックイベントについて

    VB6です comboboxを設置してクリックイベントに処理を書いたら、フォームロード時に必ず1回クリックイベントが発生します。 当初はフラグを立ててこの現象を回避していたのですが、コードを書くうちに、この最初のクリックイベントが面倒で仕方ありません。 comboboxを設置するとフォームロード時に必ずクリックイベントが発生するのはVB6の仕様なのでしょうか。 それともほかに回避の仕方があるのでしょうか。

  • ロストフォーカスイベントとその他のイベントの関係

    ロストフォーカスイベント時のその他のイベント(ボタンイベント)の中止方法 フィールドのロストフォーカスイベントで3文字以上入力していた場合に エラーメッセージを表示する。 フィールドに4文字値を入力して、フォーカスをフィールドにあてたまま ボタンを押下するとロストフォーカスイベントが走り、 同時にボタンイベントも発動してしまいます。 ロストフォーカスイベント時にエラーが発生している場合は、 ボタン押下処理を中止するようにしたいのですが、可能でしょうか? 検証は、Java1.6で行っています。

    • ベストアンサー
    • Java
  • VB6 ユーザコントロールでクリックイベント

    コンボボックスにclickイベントを書いたのち(この段階ではprivate) このコントロールをユーザコントロールにしました。 フォーム上に上記のユーザコントロールを配置したところ クリックイベントが発生しません クリックイベントを発生させるには 何か特殊な記述が必要ですか?(例えばオーバライドとか) どうすればクリックイベントを発生させられますか

専門家に質問してみよう