有谁知道是否有方法来获取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