【问题标题】:No overload for 'insert_method_here' matches delegate 'System.EventHandler'“insert_method_here”没有重载匹配委托“System.EventHandler”
【发布时间】:2011-04-04 14:03:24
【问题描述】:

我正在尝试构建一个具有按钮的程序,每次单击该按钮时,它都会移动按钮并添加到分数中。但是,我正在尝试禁用 Enter 键,或者在按下时禁止该命令。这是我目前所拥有的

private void button1_Click(object sender, EventArgs e, KeyEventArgs k)
    {
        if (k.KeyCode == Keys.Enter)
        {
            k.SuppressKeyPress = true;
        }
        score = score + 10;
        timesClicked++;
        int rand1 = RandomNumber(1, 400);
        int rand2 = RandomNumber(1, 400);
        button1.Location = new Point(rand1, rand2);
        toolStripScore.Text = ("Your score is " + score);
        toolStripClicks.Text = ("You've clicked the button{0} times " + timesClicked);
        winCheck();
    }

这是我为防止回车键进入而添加的。

if (k.KeyCode == Keys.Enter) { k.SuppressKeyPress = true; }

但是它会产生错误...“'button1_Click' 没有重载与委托 'System.EventHandler' 匹配”当单击以显示位置时,它会打开 Form1.Designer 的代码并指向这一行。 "this.button1.Click += new System.EventHandler(this.button1_Click);"

我们将不胜感激任何有关解决此问题的帮助。

【问题讨论】:

    标签: c# error-handling suppression keyeventargs


    【解决方案1】:

    您的方法签名与 EventHandler 委托不匹配(也就是说,您不能只添加 KeyEventArgs 参数并使其正常工作)。您需要处理多个事件才能执行您想要的操作(查看KeyDownKeyPress 事件)。

    或者,使用MouseClick 事件而不是Click 事件。

    【讨论】:

    • 我已经尝试将 private void Form1_KeyDown(object sender, KeyEventArgs e) 和 private void button1_KeyDown(object sender, KeyEventArgs e) 与程序中的 if 语句一起放置,并且这些都不能阻止输入从工作的关键。
    • @Cistorian try MouseClick 事件然后,它应该忽略输入键设计
    • 试试 MouseClick 是什么意思?用什么试试?
    • 试试MouseClick而不是Click
    【解决方案2】:

    嗯,我认为问题在于您对button1_click() 的声明。

    一个事件处理程序只能有签名

    delegate void EventHandler(Object sender, EventArgs e)
    

    因此,将按键从button1_click 中取出,并将其放入KeyPress 事件中。

    【讨论】:

      【解决方案3】:

      EventHandle 委托,是两个参数,不是三个。 而你的方法有三个参数,所以是错误的。

      见:EventHandler delegate information in msdn

      首先,你必须修改你的方法:

      private void button1_Click(object sender, EventArgs e)
      {
      }
      

      然后在方法中判断类型是这样的:

      KeyEventArgs k = null;
      if(e is KeyEventArgs){
          k = (KeyEventArgs) e;
          //do sth here about pressing 'enter'
      }
      

      委托,方法必须有相同的参数,相同的返回类型,否则会异常。

      【讨论】:

        【解决方案4】:

        我遇到了类似的问题。 EventHandler 委托是一个模板。

        public delegate void EventHandler(object sender, TEventArgs e);

        所以如果你换行:

        this.button1.Click += new System.EventHandler(this.button1_Click);

        到:

        this.button1.Click += new System.EventHandler(this.button1_Click);

        它应该可以工作。

        【讨论】:

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