سؤال

هل يعرف أي شخص ما إذا كانت هناك طريقة للحصول على قائمة عناصر التحكم التي لها أيقونة ErrorProvider نشطة. بمعنى آخر. أي ضوابط تفشل التحقق من الصحة. أحاول تجنب حلق جميع عناصر التحكم في النموذج.

أرغب في عرض نوع من الرسائل التي تشير إلى عدد الأخطاء الموجودة في النموذج. نظرًا لأن النموذج الخاص بي يحتوي على علامات تبويب أحاول أن أوضح للمستخدم أن الأخطاء قد توجد في علامات تبويب غير نشطة وتحتاج إلى التحقق من جميع علامات التبويب.

شكرًا

باري

هل كانت مفيدة؟

المحلول

هذا يندرج في فئة "كيف يمكنك ليس تعرف ". إنه رمز الخاص بك هو استدعاء errorprovider.seterror () ، يجب ألا تواجه مشكلة في تتبع عدد الأخطاء التي لا تزال نشطة. إليك فئة مساعدة صغيرة ، استخدم طريقة seterror () لتحديث ErrorProvider. تقوم الخاصية بإرجاع عدد الأخطاء النشطة:

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; } }
}

نصائح أخرى

اليوم واجهت نفس المشكلة. الحل الخاص بي هو تمديد عنصر تحكم 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();

هذا حل صعب إلى حد ما تتحدث عنه.

لا توجد طريقة لتحقيق ذلك تلقائيًا ، بقدر ما أعرف.

يجب عليك الحفاظ على علامة لكل عنصر تحكم وتعيينه يدويًا في كل مرة يتم فيها تراجع مقدم الطلب.

ربما Dictionary<TKey, TValue> يمكن استخدامها لتتبع ذلك.

يجب عليك استخدام seterror لتعيين الخطأ على عنصر التحكم في المقام الأول ، أليس كذلك؟ ربما يجب عليك تخزين هذه المعلومات في مجموعة أخرى في نفس الوقت إذا كنت ترغب في الحصول عليها في متناول اليد. على سبيل المثال ، يمكنك إضافة كل عنصر تحكم مع خطأ إلى Hashset.

فقط اجعل 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. هذا عمل بالنسبة لي :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top