3

私はWinFormsを初めて使用し、ユーザーがテキストボックスにデータを入力して「保存」または「キャンセル」を押すことができる基本的なフォームを持っています。ユーザーが実際にTextBoxに何かを入力することを保証するためにデータ検証を実装したかったのですが、現時点では、TextBox自体がクリックされた場合にのみErrorProviderアイコンが表示され、「保存」ボタンが押されたときに検証をチェックしていません。意図していた。Visual Studio 2013 も使用しています。

このイベント ハンドラー コードはbtnSave_Clickメソッド内にあります。

this.txtNote.Validating += new
        System.ComponentModel.CancelEventHandler(this.txtNote_Validating);

txtNote_Validatingメソッドは次のようになります。

protected void txtNote_Validating(object sender,
                         System.ComponentModel.CancelEventArgs e)
    {
        if(txtNote.Text.Length == 0)
        {
            errorProvider1.SetError((Control)txtNote, "An explanation of your time entry is required.");
        }
        else
        {
            errorProvider1.SetError(txtNote, "");
        }
    }

また、プロパティ ウィンドウにイベントを追加しておらず、プロパティ ウィンドウのbtnSave イベントにtxtNote検証イベント:txtNote_Validatingとクリック:を追加しました。btnSave_Click

私の質問は、TextBox をクリックしたときにのみ検証されるのはなぜですか。また、「保存」ボタンで TextBox の検証を ErrorProvider コンポーネントでチェックするにはどうすればよいですか?

4

1 に答える 1

5

検証の概念全体がくだらないと思います。TextBoxフォーカスを失ったときに価値を検証する必要があるのはなぜですか? ユーザーがテキストを入力するとき、または最後にユーザーがOkボタンを押して入力値の相互依存関係を確認するときに、それを検証したいと思います。

特にあなたの場合:Saveに何も入力せずにボタンをクリックする可能性があるため、検証は行われませんTextBox。または、愚かなフォームを閉じたいだけなので、Cancelに値を入力している最中にボタンをクリックすると発生します;)TextBox

検証には 2 つのアプローチがあります。

  • インスタント、編集中、ユーザーが無効なコマンドにアクセスするのを防ぎます。
  • 最後に、ユーザー コマンドを穏やかに拒否します。

最初のものは基本的にユーザー入力を常に監視しSave、すべてのフィールドが入力されて値がOKになるまでボタンを無効にします。2 番目のキープ ボタンSaveは常に有効になっていますが、ユーザーがボタンを押すとすぐにすべてが検証され、何か無効な場合は何も起こりません。

どちらのアプローチでも、ヒントを使用して、ユーザーが何が間違っているかを表示できます。あなたの場合ErrorProvider

2番目のアプローチを適用しましょう

void buttonSave_Clicked(object sender, EventArgs e)
{
    if(string.IsNullOfEmpty(txtNote))
    {
        errorProvider1.SetError(txtNote, "Omg, can't haz empty note");
        return;
    }
    if(string.IsNullOfEmpty(someOtherTextBox))
    {
        errorProvider1.SetError(someOtherTextBox, "Omg, no empty plx!");
        return;
    }
    // 
    ...
}

ここでは、値を 1 つずつ検証します。順序の最初のものはErrorProvider設定され、関数は終了します。ErrorProviderすべての無効なコントロールを表示することもできます。

void buttonSave_Clicked(object sender, EventArgs e)
{
    bool isOk = true;
    if(string.IsNullOfEmpty(txtNote))
    {
        errorProvider1.SetError(txtNote, "Omg, can't haz empty note");
        isOk = false;
    }
    if(string.IsNullOfEmpty(someOtherTextBox))
    {
        errorProvider1.SetError(someOtherTextBox, "Omg, no empty plx!");
        isOk = false;
    }
    // 
    if(isOk)
    {
        ...
    }
}

1 つの問題はErrorProvider、一度設定すると、永久に (または間違いを修正してボタンをもう一度クリックするまで) 点滅し続けることです。簡単な回避策はTimer、数秒後にエラーをオフにする使用することです。エラーを設定したら、時間切れになったらタイマーを開始します。

private void timerError_Tick(object sender, EventArgs e)
{
    timerError.Stop();
    errorProvider1.Clear();
}
于 2014-10-29T15:26:41.580 に答える