0

ここに私の状況があります:私はTabControl2 つのTabPage's( tabPage1& tabPage2) を持っています。tabPage2私が作成したカスタム ユーザー コントロールがあり (複数のフォームで使用されているため) 、カスタム ユーザー コントロールのイベントをTextBox介していくつかのカスタム検証がアタッチされています。無効なデータを選択してテキスト ボックスに入力し、テキスト ボックスを離れようとすると、検証は正常に機能し、カスタム イベント ハンドラーが実行され、指示どおりに動作しますValidatingtabPage2ただし、(この同じシナリオで)テキストボックスを離れるのではなくtabPage1fromに切り替えると、に切り替えることができますtabPage2tabPage1. 私のテキストボックスは2回検証されます。また、テキストボックスが無効であることが判明した場合にテキストボックスにフォーカスを与えるため、フォーム上で他のものを制御することはできませんが、テキストボックスに有効なデータを入れることができません! (すべてが理にかなっていることを願っています。必要に応じて明確にするために私に尋ねることを恐れないでください。)

これが私の質問です。フィールドが無効であることが判明したときにタブが切り替わらないようにするにはどうすればよいですか。したがって、検証が 2 回実行されるという問題も解決しますか?

ここに私のコードがあります: (このメソッドは、前述のカスタム ユーザー コントロールに含まれています。)

private void OnValidatingUserControl(object sender, CancelEventArgs args)
{
  if (IsTextBoxInvalid())
  {
    args.Cancel = true;
    MessageBox.Show("Invalid data in text box!!!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);

    this.textBox.Focus();
  }
}
4

2 に答える 2

0

問題の解決策は見つかりましたが、ユーザーがタブを変更できないようにする必要がある場合は、グローバル変数を作成できます

static class GlobalVariables
{
    public static bool UserControlValidationError = false;
}

OnValidatingUserControl で状態を変更する

private void OnValidatingUserControl(object sender, CancelEventArgs args)
{
  if (IsTextBoxInvalid())
  {
    args.Cancel = true;
    GlobalVariables.UserControlValidationError = true;
    MessageBox.Show("Invalid data in text box!!!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);

    this.textBox.Focus();
  }
  else
  {
    GlobalVariables.UserControlValidationError = false;
  }
}

タブがこのように変更されないようにします

private void tabCtrl_Selecting(object sender, TabControlCancelEventArgs e)
{
    e.Cancel = GlobalVariables.UserControlValidationError;
}
于 2013-06-28T21:31:34.707 に答える