2016-04-24 12 views
1

c#winformsアプリケーションでerrorproviderを使用しています。 今、私は "ダブル"検証をしたいです。テキストフィールドに一度アクセスすると、ユーザーはエラーが発生したことがわかり、一度はボタン自体に表示されます。したがって、エラーがまだ残っている場合、「保存」ボタンはグレー表示または「無効」のままになります。Errorprovider c#winforms

私は彼がエラーをしているとき、私のユーザーをブロックしたくない、と私は彼が、彼は失われたイベント「残す」または焦点上を使用してイムを望んでいる時はいつでも変更を加えることができるようにしたいので。これは、そうでなければ、あなたがあなたのエラーを変更するまで、あなたは別のフィールドに行くことができないことに気づいたからです。

だから、今のコード:

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"の下に置こうとしましたが、これはどちらも動作しません。フォーカスが失われたためです。

誰もがこれについて良いアイデアを持っていますか?私はgoogleで探していますが、私が見つけた唯一の事はerrorproviderを使った単一の検証か、イベントの検証でした。しかし、これらのイベントでは、ユーザーはいつでもエラーを編集することができません。特定のテキストフィールドにブロックします。

+0

そしてこのValidateChildren()exacltyはどのように機能しますか?マイクロソフトのウェブサイト上の例は本当に明確ではないためです。実際には機能していないので、何か間違っている必要があります。 https://msdn.microsoft.com/en-us/library/ms158374(v=vs.110).aspx – Kevin

+1

「それはありませんValidatingイベントハンドラでe.Cancel = trueを設定することはおそらくありません。したがって、ValidateChildren()メソッドは、何も検証しなかったことを知らない。これを行うもう1つの方法は、表示する番号またはエラーのアイコンを数えることです。[this class](http://stackoverflow.com/a/2682478/17034)の使用を検討してください。 –

+0

ハンス、 "それは動作しません"は少し鈍いでした。私は実際にe.cancelを設定しましたが、もう一度、ユーザーを1つのテキストフィールドにロックするシナリオを取得します。 Wichは私のopnionでとてもユーザーフレンドリーではありません。私が直面した問題は、私がelse演算子に入ったことがないということでした。言い換えれば、私は決して "検証に失敗した"ことはありませんでした。 – Kevin

答えて

1

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

はまた、ユーザーがコントロール間を移動するようにするときにエラーが発生した場合でも、設計者やコードを使用してEnableAllowFocusChangeにごFormAutoValidateプロパティを設定します。検証のための

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 
    } 
} 
関連する問題