有誰知道是否有方法來獲取ErrorProvider圖標處於活動狀態的控件列表。即。任何驗證失敗的控件。我試圖避免循環表單中的所有控件。C#WinForms ErrorProvider控件
我想顯示某種消息,指出窗體上有多少錯誤。由於我的表單包含標籤,我試圖讓用戶明白在非活動標籤上可能存在錯誤,他們需要檢查所有標籤。
感謝
巴里
有誰知道是否有方法來獲取ErrorProvider圖標處於活動狀態的控件列表。即。任何驗證失敗的控件。我試圖避免循環表單中的所有控件。C#WinForms 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; } }
}
這是你所談論的是適度棘手的解決方案。據我所知,沒有辦法自動實現這一點。
您必須爲每個控件維護一個標誌,並在每次錯誤提供者眨眼時手動設置它。
可能是一個Dictionary<TKey, TValue>
可用於跟蹤它。
您必須先使用SetError在控件上設置錯誤,對嗎?也許你應該將這些信息同時存儲在另一個集合中,如果你想讓它得心應手的話。例如,您可以將每個帶有錯誤的控件添加到哈希集。
當使用DataBinding IDataErrorInfo接口被使用,你沒有任何處理它。 – 2010-05-19 10:05:32
只是使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)中刪除了您的錯誤。 這對我有用:)
今天我有同樣的問題。我的解決方案是擴展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();
感謝漢斯。 我有一種感覺,我將不得不這樣做。根據我的時間限制,我甚至可以創建自己的自定義錯誤提供程序以供將來使用。 看起來這個功能應該與標準控件一起提供 - 也許這就是我。 再次感謝。 – codingbadger 2010-04-21 11:41:34
嗯,是的。你明確禁止在你的問題中使用GetError()。要小心你所要求的。 – 2010-04-21 12:12:02
我想我對'ErrorProvider'類的期望有點過高。儘管如此,更好的ErrorProvider可以讓你查詢出錯的控件,檢索計數等。 – IAbstract 2010-11-15 17:28:54