C#ErrorProvider想知道是否有任何活动

RcK*_*RcK 3 c# validation errorprovider winforms

我想知道我的表单中是否有任何ErrorProvider处于活动状态.能够找到这个可能有助于减少我的代码..

我在这里找到了这个东西Counting ErrorProvider

但是,有人知道更好的方式......所以这里.

好吧基本上我有一个WinForm有很多TextBoxes现在当用户输入值时我使用Validating来执行验证,如果它与Regex不匹配我为该Control设置了ErrorProvider ON ..同样如果用户将值更改为可接受的值我为该控件切换ErrorProvider OFF ..

但是当点击SAVE时我不得不做另一个检查,因为用户没有听我的意思,改变他应该的东西,仍然点击保存..我不想让事情崩溃..

soo mm就像我可以说,如果ErrorProviders没有激活,那么继续保存其他消息框说改变它.

[另一个问题]

Umm验证时仅在控制失去焦点时验证...当用户停止输入时我有点想要验证...我希望你明白我的意思

就像电子邮件地址(文本框)当用户在I [DO NOT]中输入他/她的名字时,还希望它进行验证,但是当用户完成输入时,等待ErrorProvider消失(但它不会因为它只是当控制失去焦点时)打字后2几秒钟我可以进行验证吗?

Net*_*led 13

不幸的是,ErrorProvider控件不提供此类功能.您最好使用您发布的链接中的自定义错误提供程序类.

否则,您可以创建一个您可以调用的方法而不是 SetError

int errorCount;
void SetError(Control c, string message)
{
    if (message == "")
        errorCount--;
    else
        errorCount++;
    errorProvider.SetError(c, message);
}
Run Code Online (Sandbox Code Playgroud)

或者您可以为ErrorProvider类创建一个扩展方法,该方法将设置错误并沿这些行递增计数器或其他内容.

最后但并非最不重要的是,您可以遍历所有控件.慢,但它的工作原理:

bool IsValid()
{
    foreach (Control c in errorProvider1.ContainerControl.Controls)
        if (errorProvider1.GetError(c) != "")
            return false;
    return true;
}
Run Code Online (Sandbox Code Playgroud)

编辑

我为错误提供程序编写了一个快速扩展类:

public static class ErrorProviderExtensions
{
    private static int count;

    public static void SetErrorWithCount(this ErrorProvider ep, Control c, string message)
    {
        if (message == "")
        {
            if (ep.GetError(c) != "")
                count--;
        }
        else
            count++;

        ep.SetError(c, message);
    }

    public static bool HasErrors(this ErrorProvider ep)
    {
        return count != 0;
    }

    public static int GetErrorCount(this ErrorProvider ep)
    {
        return count;
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有测试过广泛的,所以你可能要调用之前多做一点验证SetErrorErrorProvider.

  • 这不适用于多个或重复使用的ErrorProviders,因为它们共享静态计数字段.代码是秘密依赖于用户修复所有错误将计数归零的事实! (2认同)