有谁知道是否有办法获取激活 ErrorProvider 图标的控件列表。IE。任何未通过验证的控件。我试图避免循环表单中的所有控件。
我想显示某种消息,指示表单上有多少错误。由于我的表单包含选项卡,我试图让用户明白非活动选项卡上可能存在错误,他们需要检查所有选项卡。
谢谢
巴里
有谁知道是否有办法获取激活 ErrorProvider 图标的控件列表。IE。任何未通过验证的控件。我试图避免循环表单中的所有控件。
我想显示某种消息,指示表单上有多少错误。由于我的表单包含选项卡,我试图让用户明白非活动选项卡上可能存在错误,他们需要检查所有选项卡。
谢谢
巴里
这属于“你怎么不知道”的范畴。调用 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; } }
}
今天我遇到了同样的问题。我的解决方案是扩展 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 在控件上设置错误,对吗?如果您想方便使用,也许您应该同时将该信息存储在另一个集合中。例如,您可以将每个带有错误的控件添加到哈希集中。
只需将 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)中删除了错误。这对我有用:)