17

ErrorProvider アイコンがアクティブになっているコントロールのリストを取得する方法があるかどうかは誰にもわかりません。すなわち。検証に失敗したコントロール。フォーム内のすべてのコントロールをループさせないようにしています。

フォームにいくつのエラーがあるかを示す何らかのメッセージを表示したいと思います。私のフォームにはタブが含まれているため、非アクティブなタブにエラーが存在する可能性があり、すべてのタブを確認する必要があることをユーザーに明らかにしようとしています。

ありがとう

バリー

4

5 に答える 5

19

これは、「どうしてわからないのか」のカテゴリに分類されます。ErrorProvider.SetError() を呼び出しているのはコードです。まだアクティブなエラーの数を追跡するのに問題はありません。これは小さなヘルパー クラスです。その SetError() メソッドを使用して、ErrorProvider を更新します。その Count プロパティは、アクティブなエラーの数を返します。

private class ErrorTracker {
  private HashSet<Control> mErrors = new HashSet<Control>();
  private ErrorProvider mProvider;

  public ErrorTracker(ErrorProvider provider) { 
    mProvider = provider; 
  }
  public void SetError(Control ctl, string text) {
    if (string.IsNullOrEmpty(text)) mErrors.Remove(ctl);
    else if (!mErrors.Contains(ctl)) mErrors.Add(ctl);
    mProvider.SetError(ctl, text);
  }
  public int Count { get { return mErrors.Count; } }
}
于 2010-04-21T11:35:10.827 に答える
5

今日、私は同じ問題を抱えていました。私の解決策は、ErrorProvider コントロールを拡張することです。

以下のコードを参照してください。

  public class MyErrorProvider : ErrorProvider
  {

    public List<Control> GetControls()
    {
      return this.GetControls(this.ContainerControl);
    }

    public List<Control> GetControls(Control ParentControl)
    {
      List<Control> ret = new List<Control>();

      if (!string.IsNullOrEmpty(this.GetError(ParentControl)))
        ret.Add(ParentControl);

      foreach (Control c in ParentControl.Controls)
      {
        List<Control> child = GetControls(c);
        if (child.Count > 0)
          ret.AddRange(child);
      }

      return ret;
    }
  }

フォームで上記の派生クラスを使用できます。次に (myErrorProvider がフォームのクラス インスタンスであるとします)、次のように呼び出して、フォーム内のエラーのあるすべてのコントロールを取得できます。

List<Control> errorControls = myErrorProvider.GetControls();
于 2012-07-31T18:44:17.527 に答える
0

errorprovider をローカル変数ではなくグローバル変数にするだけです

public partial class MainForm
 {

    ErrorProvider errorProvider1 = new ErrorProvider();
    void Validate_Working()
    {
    errorProvider1.SetError(textbox1, "textbox is empty");
    errorProvider1.Clear();
    }


 }

から

public partial class MainForm
 {

    Void Validate_NotWorking()
    {
    ErrorProvider errorProvider1 = new ErrorProvider();
    errorProvider1.SetError(textbox1, "textbox is empty");
    errorProvider1.Clear();
    }


 }

おそらく、btnCancel_click などの別のメソッドからエラーを削除している可能性があるため、これで問題が解決するはずです。これは私のために働いた:)

于 2012-03-09T09:17:01.857 に答える
0

これは、あなたが話している適度にトリッキーなソリューションです。

私の知る限り、これを自動的に達成する方法はありません。

エラープロバイダーが点滅するたびに、すべてのコントロールのフラグを維持し、手動で設定する必要があります。

Dictionary<TKey, TValue>それを追跡するために使用できる場合があります。

于 2010-04-21T11:33:03.700 に答える
0

そもそも SetError を使用してコントロールにエラーを設定する必要がありますよね? 手元に置いておきたい場合は、おそらくその情報を別のコレクションに同時に保存する必要があります。たとえば、エラーのある各コントロールをハッシュセットに追加できます。

于 2010-04-21T11:33:37.760 に答える