【问题标题】:validating form in c# with own error provider extension在 C# 中使用自己的错误提供程序扩展验证表单
【发布时间】:2017-03-01 05:29:05
【问题描述】:

我创建了一个验证表单的方法。此方法使用另一个类的扩展。相同的代码可用于验证其他表单,但它会阻止我验证日志记录表单。代码几乎相同,但不适用于此实例。

这是我的验证方法:

public bool ValidateForm()
    {
        bool isValid = true;
        errProv.ClearErrors(txtUsername, txtPassword);
        if(String.IsNullOrEmpty(txtUsername.Text)) { errProv.SetError(txtUsername, LangRes.FieldIsRequired); isValid = false; }
        if(String.IsNullOrEmpty(txtPassword.Text)) { errProv.SetError(txtPassword, LangRes.FieldIsRequired); isValid = false; }
        return isValid;
    }

这是我提供的错误类:

public static class ErrorProviderExtension
{
    /// <summary>
    /// To Clear all errors associated with controls
    /// </summary>
    /// <param name="errProv"></param>
    /// <param name="controls"></param>
    public static void ClearErrors(this ErrorProvider errProv, params  Control[] controls)
    {
        if (controls!=null & controls.Length>0)
        {
            foreach(Control c in controls)
            {
                errProv.SetError(c, String.Empty);
            }
        }
    }
}

问题是对象引用未设置为对象的实例,但如果另一个没有此问题的情况下工作,我不明白它为什么我不明白为什么这个给我这个异常。有人可以帮忙吗?

【问题讨论】:

  • 如果您准确指出错误发生的何处,这会有所帮助吗?你试过调试这个吗?什么变量为 null 并抛出异常?
  • @rory.ap errProv.SetError(c, String.Empty); errProv.ClearErrors(txtUsername, txtPassword);这一行
  • 它真的是工作代码吗?我可以看到如果 (controls!=null & controls.Length>0) 只有一个 & 不起作用,你应该有 &&。
  • 它绝对有效,因为我尝试了其他方法并且代码完全相同。
  • C# 语言通常提供在调用站点引发 NullReferenceException 的保证。但这在扩展方法的特定情况下不起作用,您会在方法本身中获得异常。您需要练习调试,但这并不难帮助您看到 errProv 变量为空。只需将鼠标悬停在名称上即可查看它们包含的内容。变量名称与扩展方法参数名称完全匹配是潜在错误的另一个提示。通常的名称类似于“this.errorProvider1”。

标签: c# validation error-handling runtime-error


【解决方案1】:

您似乎还没有实例化errProv。这是在哪里定义的?你有没有在任何地方调用过它的构造函数?

您正在尝试使用errProv(即SetError)的方法,但errProv 为空。你不能在不存在的东西上调用方法。

更多信息请参见:What is a NullReferenceException, and how do I fix it?

【讨论】:

  • 使用 mHotRes.DesktopPresentation.Extensions;这是我定义使用它的地方。我没有在其他类中做任何其他验证,它有效。
  • 您在登录表单设计器中是正确的,它说private System.Windows.Forms.ErrorProvider errProv;
  • 您可以在表单的构造函数中为其赋值。
  • 当我尝试这样做时,它说登录表单已经包含 errProv 的定义
  • 使用现有的定义。不要定义一个新的。 errProv = new ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 2013-04-28
  • 2015-07-19
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多