2010-04-21 100 views
16

有誰知道是否有方法來獲取ErrorProvider圖標處於活動狀態的控件列表。即。任何驗證失敗的控件。我試圖避免循環表單中的所有控件。C#WinForms ErrorProvider控件

我想顯示某種消息,指出窗體上有多少錯誤。由於我的表單包含標籤,我試圖讓用戶明白在非活動標籤上可能存在錯誤,他們需要檢查所有標籤。

感謝

巴里

回答

16

這屬於「你怎麼能不知道知道」。它是調用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; } } 
} 
+0

感謝漢斯。 我有一種感覺,我將不得不這樣做。根據我的時間限制,我甚至可以創建自己的自定義錯誤提供程序以供將來使用。 看起來這個功能應該與標準控件一起提供 - 也許這就是我。 再次感謝。 – codingbadger 2010-04-21 11:41:34

+0

嗯,是的。你明確禁止在你的問題中使用GetError()。要小心你所要求的。 – 2010-04-21 12:12:02

+2

我想我對'ErrorProvider'類的期望有點過高。儘管如此,更好的ErrorProvider可以讓你查詢出錯的控件,檢索計數等。 – IAbstract 2010-11-15 17:28:54

0

這是你所談論的是適度棘手的解決方案。據我所知,沒有辦法自動實現這一點。

您必須爲每個控件維護一個標誌,並在每次錯誤提供者眨眼時手動設置它。

可能是一個Dictionary<TKey, TValue>可用於跟蹤它。

0

您必須先使用SetError在控件上設置錯誤,對嗎?也許你應該將這些信息同時存儲在另一個集合中,如果你想讓它得心應手的話。例如,您可以將每個帶有錯誤的控件添加到哈希集。

+0

當使用DataBinding IDataErrorInfo接口被使用,你沒有任何處理它。 – 2010-05-19 10:05:32

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)中刪除了您的錯誤。 這對我有用:)

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();