none
TabControl と ErrorProvider と Button を利用したウィザード風アプリの検証処理に関するロジック RRS feed

  • 質問

  • お世話になっております。

    .NET Framework 2.0 (VS2013 の C#) で、ウィザード風のフォームアプリケーションを作成しています。

    1つのフォームに、タブコントロール(ページがいくつか)、戻るボタン、次へボタン、キャンセルボタン、エラープロバイダを配置しています。

    タブコントロールのページにはテキストボックスをいくつか配置しています。戻るボタン、次へボタン、キャンセルボタンをクリックしたときだけ、タブ選択を動かせるように、Selectingイベントを加工しています(移動はかならずボタンを経由させ、タブをクリックしても選択されないようにしてあります)。

    ------------------------------------------------------------------------------------------------------

    仕様として、各ページのテキストボックスは、入力が必須です。入力されていない項目があるときは、次のページに進めないようにします。

    ただし、戻るボタンで前のページへ戻ったり、キャンセルボタンで終了のは表示中のページのテキストボックスに未入力があっても可能にします。

    ------------------------------------------------------------------------------------------------------

    キャンセルボタンは、フォームのCancelButtonプロパティに登録してあります。

    各ボタンのCauseValidationは、戻るボタンとキャンセルボタンはFalse、次へボタンはTrueを設定しています。

    各ページのValidatingイベントを捕捉して、テキストボックスで空のものがある場合にはエラープロバイダにメッセージを登録し、e.Cancel = Trueをセットして画面遷移しないようにしています。

    戻るボタンは、TabControlのSelectedIndexを-1,次へボタンは+1、キャンセルボタンは、メッセージボックスで(閉じて良いか)確認後、Application.Exit()で終了させるか、なにもせずに戻ります。


    上記の設定ですと、キャンセルボタンと次へボタンは仕様どおり動きますが、戻るボタンでは(CauseValidationをFalseにしているにもかかわらず)常に検証が走ってしまいます。

    戻るボタンで表示されるページのCauseValidationがTrueになっているために検証が働くものと考えて、すぺてのタブページのCauseValidationをFalseにしてみると、今度は次へボタンの(CauseValidationがTrueになっているにもかかわらず)検証機能が働かなくなります。

    また、タブコントロール(ページ)上の検証が走るきっかけとなるコントロールはタブコントロール上にあるもの(=タブページ)だけが対象かと思い、試しにキャンセルボタンのCauseValidationをTrueにすると、タブコントロール(ページ)上にないボタンにもかかわらず検証機能はしっかり働きます。

    CauseValidationプロパティの説明では、フォーカスをうけたときに検証処理を動かすか否か(そのコントロールがきっかけになる)を指定すると書かれていますが、MSDNライブラリの説明はこれらの挙動と食い違うように思います。

    タブコントロールを使用すると、検証機能のスコープ(対象コントロールの範囲)がちぐはぐになってしまうのでしょうか?タブコントロールを使ってうまく検証機能を動かせたことがある方、何か注意点などありましたらご教示下さると幸いです。

    宜しくお願い致します。










    2014年2月19日 12:08