1

ac# winforms アプリケーションで errorprovider を使用しています。ここで、「二重」の検証が必要です。直接テキストフィールドに一度、ユーザーは自分がいくつかのエラーを犯したことを確認し、ボタン自体に一度。そのため、まだエラーがある場合、「保存」ボタンはグレー表示または「無効」のままになります。

ユーザーがエラーを起こしているときにユーザーをブロックしたくないので、イベント「離れる」またはフォーカスを失ったときにいつでも変更できるようにしたいからです。そうしないと、エラーを変更するまで別のフィールドに移動できないことに気付いたからです。

したがって、コードは次のとおりです。

    private void txtFirstname_Leave(object sender, EventArgs e)
    {
        if (!InputChecks.IsFilledIn(txtFirstname.Text))
        {
            errorProvider1.SetError(txtFirstname, "Firstname needs to be filled in!");
            isValidated = false;

        }
        else
        {
            errorProvider1.SetError(txtFirstname, "");
            isValidated = true;

        }
    }

ここまでは順調ですね。エラー プロバイダーは正しく機能し、ユーザーはいつでも編集できます。

 public void setSaveButton()
    {
        if (isValidated == true)
        {
            btnSave.Enabled = true;

        }
        else
        {
            btnSave.Enabled = false;
        }   
    }

 bool isValidated;
    private void btnSave_Click(object sender, EventArgs e)
    {

        if (isValidated == true)
        {

            employeePresenter.addEmployee(txtFirstname.Text, txtLastname.Text, txtUsername.Text, txtPassword.Text);
        }



    }

これはまだ私の頭の中で大丈夫でした。しかし、ユーザーがいつでも問題を変更できるようにしているため、これは機能しません。メソッド「setSaveButton()」を「isvalidated」の下に配置しようとしましたが、これも機能しません。フォーカスが失われたため。

誰でもこれについてより良いアイデアを持っていますか? 私はグーグルで探していましたが、見つかったのはエラープロバイダーによる単一の検証、またはイベントの検証だけでした。しかし、これらのイベントでは、ユーザーがいつでもエラーを編集できるわけではありません。それらを 1 つの特定のテキスト フィールドにブロックします。

4

1 に答える 1

3

保存ボタンを無効にする必要はありません。フォームのメソッドを確認するだけで十分ValidateChildrenです。false が返された場合は、検証エラーがあることを意味します。このアプローチを使用するには、コントロールのエラーを設定するときに、コントロールのイベントで設定e.Cancel = trueすることを忘れないでください。Validating

また、エラーが発生した場合でもユーザーがコントロール間を移動できるようにするには、デザイナーまたはコードを使用してプロパティAutoValidateをに設定します。FormEnableAllowFocusChange

this.AutoValidate = System.Windows.Forms.AutoValidate.EnableAllowFocusChange;

検証用コード:

private void txtFirstname_Validating(object sender, CancelEventArgs e)
{
    if (string.IsNullOrEmpty(this.txtFirstname.Text))
    {
        this.errorProvider1.SetError(this.txtFirstname, "Some Error");
        e.Cancel = true;
    }
    else
    {
        this.errorProvider1.SetError(this.txtFirstname, null);
    }
}

private void btnSave_Click(object sender, EventArgs e)
{
    if (this.ValidateChildren())
    {
        //Here the form is in a valid state
        //Do what you need when the form is valid
    }
    else
    {
        //Show error summary
    }
}
于 2016-04-24T19:38:08.587 に答える