【问题标题】:C# No overload for [Method] matches delegate 'System.EventHandler - Adding an extra parameter[方法] 的 C# 无重载匹配委托 'System.EventHandler - 添加额外参数
【发布时间】:2012-05-13 03:40:48
【问题描述】:

我是 C# 的新手,我的作业有问题。对于某些按钮的单击事件,我有以下内容。对于单击事件,我想调用一个名为 functionA 的函数,其参数名为 parameterB,一个双精度类型数组。附加参数导致错误。我这样做的正确方法是什么?

private void button1_Click(object sender, EventArgs e, double [] parameterB)
  {
      functionA(parameterB);
  }

在 Designer.cs 的相应部分中

this.button1.Location = new System.Drawing.Point(386, 309);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(174, 27);
this.button1.TabIndex = 25;
this.button1.Text = "Calculate Final Grade";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);

【问题讨论】:

  • 你从哪里得到parameterB?它不会传递给 click,但如果您告诉我们它是在某个文本字段中还是在您的程序的其他地方,我们可以帮助您弄清楚如何将其传递给 functionA
  • 感谢您的帮助。参数B是经过一些计算后从另一个函数返回的成绩列表,假设是functionC。

标签: c# function overloading


【解决方案1】:

您不会调用 button1_Click - 它会在最终用户单击您的按钮时被调用。检测按钮点击的系统部分知道如何使用一种方式通知您的程序点击:通过调用带有签名的方法

void OnClick(object sender, EventArgs e)

您不能在参数列表中添加或删除参数,或更改方法的返回类型:它必须与此签名精确匹配。

现在回到您的parameterB:您需要它来调用functionA 方法,但它不会传递给事件处理程序。那你怎么得到它?通常,答案是您将其存储在执行事件处理的对象的实例中:声明一个 double[] 类型的实例变量,当您有足够的数据进行设置时设置它,然后从内部将其传递给 functionA你的button1_Click 方法。

【讨论】:

  • 什么是“当你有足够的数据设置它时设置它”是什么意思?这听起来像是一个愚蠢的问题,但在我的情况下,执行事件处理的对象是什么......?这是否意味着我必须在 EventArgs 中声明 parameterB? (我该怎么做?)
  • 哦,经过一番修改,我想我现在明白了。我在原始函数 C 之外声明了本地 double[] 变量。现在后续方法现在可以调用该变量,据我了解,我将该变量称为“全局变量”对吗?但这是正确的方法吗?也许我仍然没有抓住重点。
  • @AndrewChiLam 当你在函数外部声明一个变量时,它不再是local,但它不会变成global:它变成了一个实例变量。实例变量对类的所有方法都是可见的,并且每个实例都有自己的副本。您可以通过声明privateprotectedpublic(在您的情况下应该是private)来进一步控制对该变量的访问。私有实例变量是 OOP 中隐藏信息的主要工具,所以是的,这是正确的方法。
【解决方案2】:

当您尝试添加另一个参数时,事件处理程序不再与定义匹配。 EventHandler 由 2 个参数定义。

发件人
类型:System.Object
事件来源。

e
类型:System.EventArgs
一个不包含事件数据的 EventArgs。

您需要将 parameterB 设置为属性,或您的表单的field。然后,您将从事件处理程序中获取 parameterB

【讨论】:

猜你喜欢
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多