我想知道我的表单中是否有任何 ErrorProvider 处于事件状态。
能够找到这一点可能有助于减少我的代码..

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

但是如果有人知道更好的方法……那么就这样吧。

好的,所以基本上我有一个 WinForm,它有很多 TextBox
现在,当用户输入值时,我使用 Validating 来执行验证,如果它与 Regex 不匹配,我会将该控件的 ErrorProvider 设置为 ON.. 同样,如果用户将值更改为可接受的值,我会将该控件的 ErrorProvider 关闭。

但是当点击 SAVE 时,我必须再做一次检查,以防万一用户没有听我的话,改变了他应该做的事情,但仍然点击了 SAVE .. 我不想让事情崩溃..

soo mm 有没有像我可以说如果 ErrorProviders 不事件然后继续保存其他消息框说更改它的事情。

[另一个问题]

嗯,当验证它时只验证当控件失去焦点时......我有点希望它在用户停止输入时进行验证......我希望你明白我的意思

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

最佳答案

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

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

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

或者你可以为 ErrorProvider 类创建一个 extension method 来设置错误并增加一个计数器或类似的东西。

最后但并非最不重要的是,您可以遍历所有控件。慢,但它有效:
bool IsValid()
{
    foreach (Control c in errorProvider1.ContainerControl.Controls)
        if (errorProvider1.GetError(c) != "")
            return false;
    return true;
}

编辑

我为错误提供者编写了一个快速扩展类:
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;
    }
}

我还没有对其进行广泛的测试,因此您可能需要在对 SetError 调用 ErrorProvider 之前进行更多验证。

关于C# ErrorProvider 想知道是否有事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12323044/

10-13 08:03