C# '无过载;按钮';匹配委托';EventHandler';;

C# '无过载;按钮';匹配委托';EventHandler';;,c#,winforms,C#,Winforms,对于使用windows论坛和im来说,这是一个相当新的问题,在搜索解决方案时,我改变了方法 private void button_click(object sender, EventArgs e) 对此 public void button_click(object sender, EventArgs e, int attack1, int hp2) 这在该视图中工作正常,但Designer选项卡发出错误“button\u click的无重载”匹配委托“EventHandl

对于使用windows论坛和im来说,这是一个相当新的问题,在搜索解决方案时,我改变了方法

    private void button_click(object sender, EventArgs e)
对此

    public void button_click(object sender, EventArgs e, int attack1, int hp2)
这在该视图中工作正常,但Designer选项卡发出错误“button\u click的无重载”匹配委托“EventHandler”。
整数是在该论坛的构造函数中创建的。是否有解决方案来解决该问题,或者是否有更好的方法在方法之间使用整数

事件处理程序应与委托的签名完全匹配-即参数的类型和计数以及返回值的类型应与为事件委托定义的类型相同。
onClick
事件的类型为
EventHandler
委托。该委托定义为

public delegate void EventHandler(object sender, EventArgs e)
附加到事件的处理程序应该具有完全相同的签名-
void(object,EventArgs)

即使可以使用具有不同签名的处理程序,您也忘记了事件是由
按钮
实例引发的。按钮如何知道为其他方法参数提供哪个值?它对攻击和hp一无所知。并且您无法修改按钮类实现以传递一些其他参数这是给你的

如果要在事件处理程序中使用一些附加值,则应将这些值存储为表单字段:

public class Form1 : Form
{
   private int attack;
   private int hp;

   public Form1()
   {
       // initialize attack and hp here
   }

   private void button_click(object sender, EventArgs e)
   {
       // attack and hp avalilable here
   }
}
或者,您可以将一些信息存储在按钮的
标记
属性中,并从事件的发送方检索该信息:

   private void button_click(object sender, EventArgs e)
   {
       var button = (Button)sender;
       // use button.Tag
   }

为什么要在事件处理程序中使用这些参数,以及当用户单击按钮时,您认为谁将为这些参数提供值?这是因为它连接到按钮的单击事件,该事件具有特定签名-它只接受一个对象和一个事件参数。从按钮引发的事件是
对象,EventArgs
,您应该使用按钮的常规签名订阅该按钮,并使用所需的参数/参数生成一个新的自定义
EventHandler
。如果您知道按钮单击事件中attack1和hp2的值,则可以从该事件调用另一个方法并将这些值传递给它。您永远不会调用
按钮\你自己点击
(如果你点击了,那么你是做错了)。因此,将永远不会有机会传递您自己的变量。您可以扩展您的答案,建议使用所需的signature@bradbury9--OPs代码永远不会调用委托--winforms子系统中的按钮单击事件会调用委托。那么您将如何处理新事件?因此,我的最佳选择是创建一个新的public方法初始化INT,而不是在构造函数中初始化?@Minimarshman why?上面的代码以constructor@SergeyBerezovskiy所以我的int是在构造函数中创建的,然后我应该在public Form1中分配一个值,因为当前它们是在一个switch语句中分配的值,该语句检查什么是攻击此外,以前写私有代码似乎会导致许多不同类型的错误