• ベストアンサー

イベントのキャンセル

VS2005standardのVB.NETで開発しています。 質問: テキストフィールドからフォーカスアウトした瞬間に形式チェックロジックを走らせていますが、画面の右下に設置した「キャンセルボタン」を押下するタイミングでフォーカスアウトしたら、イベントをキャンセルしたい 要するにキャンセルして画面を閉じたいのに、フィールドの入力形式がが違うとエラーが出るので、うっとうしいのです。 こういう場合の簡単な対応方法ってありますか? お教えください。

質問者が選んだベストアンサー

  • ベストアンサー
noname#187541
noname#187541
回答No.3

こんにちは。 どのイベントでチェックしているのでしょうか? Validatingイベントであれば、キャンセルボタンをクリックしてもValidatingイベントが発生しないように設定すればいいです。 発生しないようにするには、キャンセルボタンのCausesValidationプロパティをFalseにすれば出来ます。 ただし、このCausesValidationプロパティにはちょっとしたクセがあるので注意が必要です。 下記URLに詳しく載っていますので参考にどうぞ。CausesValidationプロパティについては真ん中より少し下の方にあります。

参考URL:
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard23.htm
takashi_it
質問者

お礼

おぉ~、これですか!ありがとうございました。 これで、解決できそうです。

その他の回答 (2)

回答No.2

私の場合はエラーチェック用のプロシージャを1つ用意して、[登録]ボタンが押されたときに全項目のチェックを行うようにしています。 1つ1つのエラーメッセージは改行してつなげて、1つのメッセージボックスで表示するようにしています。 (数十箇所チェックしてもエラーが数十箇所あるとは限らないので、大体入りきります。) この方法だと項目1~項目20まであったとして、「項目20がAのとき項目1がBならエラー」といった関連チェックもできますし。 フィールドごとに随時チェックしてエラーメッセージを出すのなら、メッセージ用のテキストボックスを用意して、 そちらにエラーメッセージを表示したらどうでしょうか。(目立つような色にして。) これでしたら、その都度メッセージボックスが表示される煩わしさはなくなると思いますが。

takashi_it
質問者

お礼

ご意見ありがとうございます。 ただし、この方式は仕様的に無理です。

回答No.1

テキストボックスのLostFocusイベントの方がボタンのClickイベントより先に実行されるので無理ではないでしょうか。 [キャンセル]ボタン以外に、[登録]や[確定]のボタンはないのでしょうか。 あるなら、そちらのClickイベントで形式チェックを行えば良いのでは。

takashi_it
質問者

補足

回答ありがとうございます。 登録ボタンあります。 確かにその手も考えましたが、チェック箇所が、数十箇所におよびます。 入力の最後の最後で、一括チェックだと諸々と面倒なので、そのフィールドに閉じた箇所でチェックを掛けようと思いました。 ※他解決案として 「キャンセルボタン」のMouseEnterイベントを取って、checkflgをfalseにする で、各フィールドのLostFocus時に、そのフラグを見て、falseなら実行しないというのを考えました。 でも、これだと、Mouseカーソルがキャンセル上にあるときに、tab移動をされると、チェックをスルーしてしまうので、そこにまた別のcheckをかける必要が出てくる・・・といった感じで、非常に美しくありません。 皆さんこういう場合は、どうしてるのかと思ったわけです。

関連するQ&A

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

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

    • ベストアンサー
    • Java
  • VB2008 DataGridView セル移動キャンセル

    VB2008 DataGridView セル移動キャンセル いつもお世話になってます。 Windows7 VB2008で現在開発しております。 画面にDataGridVIewと2つのボタン(更新、終了)がはっつけてあります。 列にはID、パスワード、名前、生年月日、性別があるとします。 やりたい事は IDを入力しセルからフォーカスが離れるとDBを参照し 登録されているIDの場合では他の項目を出力させますが 登録されていないIDの場合には「未登録」とメッセージ表示させ、 フォーカスは入力したセルのまま、というように動作させたいんです。 フォーカス移動をキャンセルしたいのでCellValidatingイベントで記述してますが 終了ボタンを押そうとフォーカスがセルから離れた瞬間メッセージ出力で ボタンから画面が閉じれなくなりました。 CellValidatingに記述してるのは以下みたいな感じです。 Private Sub DataGridView_CellValidating(Byval sender As ~, Byval e As ~) … ・・・ If Not ID登録チェック関数 Then MsgBox("未登録") e.Cancel = True End If ・・・ End Sub これってどう回避しますか? それか、使ってるイベントがよろしくないんでしょうか?

  • SSTABでのKEYDOWNイベント

    VB6・SP5で開発を行っています。 FormのKEYDOWNイベントでPageUp・PageDownの押下の際に、 SSTAB上のアクティブなTABをずらす処理を行おうとしています。 問題はSSTAB上にフォーカスが移った直後だけ、 KEYDOWNイベントが2回実行されてしまうというものです。 KEYUPについても同様でした。 このような現象をご存知の方、 対処方法をお教えくださる方がいらっしゃいましたらよろしくお願いします。 ちなみにモジュール変数等のフラグはなるべく使用したくありません。

  • Access データ表示 完了時のイベント

    Access2003で開発しております。 フォームのLoadが完了したというタイミングを取得したいのですが、 Formのイベントでそのようなイベントはありますでしょうか? 本当は「各テキストボックスにテーブルからのデータがセットされた後」 というタイミングが取得したいのですが、VBとは違い、ロジックに よる値の変更ではChangeイベントは発生しないようで・・・、 AfterUpdateイベントも、フォーカスを当てて直に編集しないと 発生しないようなので・・・。ですので、値セットが完了した= Form_Loadが完了した、というようなイベントがありましたら ご教授願いします。宜しくお願いします。

  • フォーカスがどこか行ってしまう

    Windows2000、VB6.0、ActiveReport2.0で開発をしております。 メニュー画面から処理画面を起動(メニュー画面は開いたまま)し、 処理画面から実行押下にて実行処理&印刷をするプログラムになっています。 印刷はある条件を満たさなかった場合、帳票側でキャンセル処理(Me.Cancel)をしています。 処理が印刷が終わったら(実行処理していても)フォーカスを処理画面のテキストボックスに移動させるようにしています。しかし、印刷がキャンセル処理された場合にフォーカスがどこか行ってしまいます。 何か対処法などありますでしょうか?

  • VBとSQLServerのセッションが切れる時のイベント

    お世話になっております。 VB6.0、SQLServerを利用して開発を行っています。 セッションが切れてしまうことで不具合が生じていて現在対応のため調査しているのですが・・・ VBのイベントでセッションが切れる瞬間のイベントというのは存在するのでしょうか?

  • VB.NET開発(イベントプロシージャはマルチスレッドですか?)

    VB.NET開発(イベントプロシージャはマルチスレッドですか?) 以前より.NETのWindowsフォームの業務アプリ開発してますが、基本的な質問をさせて下さい。 イベントプロシージャの実行処理は、本体スレッド(実行時のスレッド)とは別のスレッドで動作しているのでしょうか。 例えば、ボタンのクリックイベントに何かしらの重い処理があったとします。このクリックイベントの処理ではボタンの制御をしていないので、イベントプロシージャの実行中は、処理中のボタンが押下可能な前提とします。この時、このボタンを3回押下して実行させると3つのスレッドが新規に作成されて実行していると考えて宜しいのでしょうか。 デリゲートやイベントに関するキーワードで検索して、いくつか資料を見たのですが、上記の疑問にぴったり合う解答がなく、質問させて頂きました。 業務アプリの開発で、今まで、あまりマルチスレッドなど意識せずやってきましたが、実は意識しなくても、マルチスレッドの開発をしていたことになるのでしょうか。 以前、VB6の開発もしておりました。 ちなみにVB6の場合も、イベントプロシージャはマルチスレッドで実行されていると考えて宜しいのでしょうか。 よろしくお願いします

  • TabStripのイベントについて

    VB6にて開発しています。 VB.NETと違い、VB6の[TabStrip]には各ページにコンテナが用意されていません。 そこで、[PictureBox]をコンテナにして、実行時の[Crick]イベントにて [SelectedItem.Index]を参照し、[Visible]プロパティを切り替えて使用しています。 しかしここでひとつ不具合が起こります。 タブをクリック(押下)したままドラッグしてフォーム外でドロップすると、 タブ自体は切り替わりますが、[Crick]イベントが発生しません。 [TabStrip]の[MouseUp]イベント時に[Crick]イベントをコールするという方法で 回避しています。 ですが、そもそも一般のタブは(例えば画面のプロパティ等のタブ) マウスを押した(押下)時点でページが変わります。 これを実現したく、思考錯誤しています。 [Crick]イベントでは、マウスを押して放した時にイベントが発生します。 マウスを押した(押下)時点で切り替えるには、必然的に[MouseDown]時に [Visible]プロパティを切り替えなければいけないと思うのです。 が、イベントの発生順序は[MouseDown]→[Crick]→[MouseUp]という順で発生する為、 どうしても[Crick]時に取得する[SelectedItem.Index]が[MouseDown]時に取得できず、 実現しません。 VB6でマウスを押した(押下)時のページ切り替えを実現する方法はないのでしょうか? [参考] Private Sub TabStrip1_Click() Dim i As Byte With Me For i = 0 To 8 .Picture1(i).Visible = False Next i i = .TabStrip1.SelectedItem.Index - 1 .Picture1(i).Visible = True End With End Sub

  • DateTimePickerにイベント追加したい

    VB.net2008で開発しています。 DateTimePickerを画面に貼り付けて使用しているのですがイベントにダブルクリックがありません。 画面に配置したコントロールにイベントを追加することってできますか? ご教授のほどよろしくお願い致します。

  • ユーザコントロールでのEnterキータブ移動

    開発言語:VS2008・C# VS2008・C#で郵便番号や電話番号を入力できるユーザコントロールを作成しています。 入力フィールドはTEXTBOX、区切り文字はLABELで、 郵便番号なら3桁 + 区切り文字(-) + 4桁 電話番号なら3桁 + 区切り文字(-) + 4桁 + 区切り文字(-) + 4桁 といった感じで、プロパティで設定された値により、動的に入力フィールドのTEXTBOXを作成しています。 上記のユーザコントロールをフォームに配置し、ENTERキーでフォーカスを移動させたいのですが、現時点で、ユーザコントロール内のTEXTBOXでENTERを押した場合フォーカスはユーザコントロール内の次のTEXTBOXに移動するのですが、最後のTEXTBOXでENTERキーを押した場合ユーザコントロールからフォーカスが移動しなくなってしまいます。 例)住所フィールド(TEXTBOX)→ENTER押下→郵便番号(ユーザコントロール)の上3桁フィールド→ENTER押下→郵便番号(ユーザコントロール)の下4桁フィールド→ENTER押下(フォーカスが次のコントロールに移動しない) ユーザコントロール内のENTERキー移動はKeyDownイベントに関連付け行っていますが、これだとユーザコントロール内しかENTERでフォーカスが移動せずフォーム上の次のコントロールにフォーカスが移動しません。 どなたか、ENTERキーでユーザコントロールからフォーカスが移動できる方法を教えてください。

専門家に質問してみよう