【问题标题】:Wrong Function being called or No Overload for Method调用了错误的函数或方法没有重载
【发布时间】:2012-04-30 21:18:40
【问题描述】:

我有一个函数,用于在用户浏览目录后验证某些文本框的内容。

private void CheckValidation(object sender, EventArgs e)
{
    bool OK = true;
    if (PhotograherNumber.Text == string.Empty || errorProvider1.GetError(PhotograherNumber)!="")
    {
        OK = false;
    }
    if (EventNumber.Text == string.Empty || errorProvider1.GetError(EventNumber)!="")
    {
        OK = false;
    }
    if (OK)
    {
        EnableProcessNow();
    }
    else
    {
        DisableProcessNow();
    }

}

效果很好。

但后来我在文本框上添加了Validated 事件要调用的函数。

一旦我这样做了,它就创建了这个:

private void CheckValidation()
{

}

同样,这对于 Validated 事件来说没有问题。然而,在我程序的另一部分,我调用了函数CheckValidation();。但是当我这样做时,它不会调用正确的。

显然,如果我删除空的

private void CheckValidation()
{

}

然后我收到错误“方法 CheckValidation 没有重载需要 0 个参数”。

那么我如何在我的代码中调用正确的CheckValidation,但仍确保我仍然可以从事件中调用它?

【问题讨论】:

  • 这里是否缺少某种基类? CheckValidation 是否隐藏了已设置默认值的受保护或公共成员?
  • 你是说你调用CheckValidation()(无参数)并且调用了有两个参数的方法吗?这不可能,参数设置成什么?
  • @svick - 我认为他试图做的是调用事件处理程序 - 但不知道如何传递参数 - 所以尝试 '()' 但这不起作用 - 除非他指定了空方法-但随后调用了“错误的方法”-当然
  • 也许可以用调试器进入CheckValidation(),看看它的去向..

标签: c# function methods


【解决方案1】:

根据我对您的问题的理解,您希望运行相同的方法,但都能够在没有参数的情况下手动调用它并允许它成为事件处理程序?

如果您想从代码中调用处理程序方法,您可以调用 CheckValidation(null, EventArgs.Empty); - 但是更好的解决方案是将代码放入 CheckValidation() 重载(不带参数)并从处理程序调用:

private void CheckValidation(object sender, EventArgs e)
{
    CheckValidation();
}

private void CheckValidation()
{
    // Code here
}

【讨论】:

    【解决方案2】:

    如果您调用CheckValidation();,它将在没有参数的情况下运行重载。如果您调用CheckValidation(null, EventArgs.Empty);,它将使用对象、EventArgs 参数运行重载。

    确保您的外部调用传递了正确数量的参数来完成这项工作。

    就个人而言,如果我调用表单事件使用的方法,我会将this 作为发送者传递,但这取决于您使用的模型和您的对象安全性(某些对象不能安全地传递)。

    objectReference.CheckValidation(this, EventArgs.Empty);
    

    另请注意,如果您在外部调用该方法,则它需要是公共的,并且必须从类的实例中调用(除非该方法是静态的,必须从类型名称中调用)。

    【讨论】:

      【解决方案3】:

      如果您不使用 CheckValidation 方法作为某些事件处理程序,则只需从此函数中删除参数。你可以这样称呼它CheckValidation();。如果此方法用作某些事件处理程序,则还要从 CheckValidation 方法中删除参数(无论如何您不使用它们)并在该事件处理程序中调用它:

      private void SomeEventHandler(object sender, EventArgs e)
      {
          CheckValidation();
      }
      

      还可以考虑从您的方法中删除布尔标志:

      private void CheckValidation()
      {
          if (PhotograherNumber.Text == "" || errorProvider1.GetError(PhotograherNumber)!= "")
          {
              DisableProcessNow();
              return;
          }
      
          if (EventNumber.Text == "" || errorProvider1.GetError(EventNumber)!= "")
          {
               DisableProcessNow();
               return;
          }
      
          EnableProcessNow();
      }
      

      更进一步,我将创建描述您实际检查的内容的方法:

      private void CheckValidation()
      {
          if (!IsAllInputValid())
          {
              DisableProcessNow();
              return;
          }
      
          EnableProcessNow();
      }
      
      private bool IsAllInputValid()
      {
          if (!HasValidInput(PhotograherNumber))
              return false;
      
          if (!HasValidInput(EventNumber))
              return false;
      
          return true;
      }
      
      private bool HasValidInput(TextBox textBox)
      {
          if (String.IsNullOrEmpty(textBox.Text)
              return false;
      
          return errorProvider1.GetError(textBox) != "";
      }
      

      【讨论】:

      • 他想将 CheckValidation 连接到需要参数列表的事件处理程序。删除参数列表不是一种选择。他对这两个函数有问题,一个有参数,另一个没有
      • CheckValidation 方法中不使用参数。我指出了从事件处理程序中提取此方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      相关资源
      最近更新 更多