C#Winforms错误提供控制
-
30-09-2019 - |
题
有人知道是否有一种方法可以获取具有ERRORPROVIDER ICON活动的控件列表。 IE。任何失败验证的控件。我正在尝试避免以形式循环所有控件。
我想显示某种消息,指示表格上有多少个错误。由于我的表格包含选项卡,我试图使用户显而易见,错误在非活动选项卡上可能存在错误,因此他们需要检查所有选项卡。
谢谢
巴里
解决方案
这属于“你怎么能 不是 知道“。是您的代码呼叫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; } }
}
其他提示
今天我有同样的问题。我的解决方案是扩展错误提供者控件。
请参阅下面的代码:
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首先在控件上设置错误,对吗?也许如果您想方便使用,则应该同时将这些信息存储在另一个集合中。例如,您可以将每个控件添加到标签。
只需将错误推广器作为全局变量而不是局部变量
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)中删除了错误。这对我有用:)
不隶属于 StackOverflow