我该如何解决这个“pictureBox_1 没有重载匹配委托 'System.Event.Handler'”的问题

How do I fix this 'no overload for pictureBox_1 matches delegate 'System.Event.Handler''

我一直在尝试通过教程和这个网站自学 C#,但我不知道如何使用箭头键让我的 "character" 移动,所以我从这里复制了代码,希望它能正常工作。很好,直到我 运行 然后它抛出这个错误

Error 1 No overload for 'pictureBox1_Click' matches delegate 'System.EventHandler' c:\users\collin\documents\visual studio 2013\projects\my_rpg\my_rpg\form1.designer.cs 80 39 My_RPG

这是我复制的代码(我确实将名称从原来的名称更改为 pictureBox1,所以这是正确的

public MainScreen()
    {
        InitializeComponent();
        KeyDown += new KeyEventHandler(MainScreen_KeyDown);
        if (characterCreated == false)
        {
            playGameBtn.ForeColor = Color.Gray;

        }
    }
private void pictureBox1_Click(object sender, KeyEventArgs e)
    {
        int x = pictureBox1.Location.X;
        int y = pictureBox1.Location.Y;

        if (e.KeyCode == Keys.Right)
        {
            x += 2;
        }
        else if (e.KeyCode == Keys.Left) 
        {
            x -= 2;
        }
        else if (e.KeyCode == Keys.Up)
        {
            y += 2;
        }
        else if (e.KeyCode == Keys.Down)
        {
            y -= 2;
        }

        pictureBox1.Location = new System.Drawing.Point(x, y);

    }

然后,如果我单击错误,它会将我发送到这行代码,如果我进行编辑,它就会抛出错误

        this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click);

PictureBox Click 事件的签名需要一个接收对象和 EventArgs 参数的方法。

您的代码使用对象和 KeyEventArgs 声明了 pictureBox_Click 方法。编译器当然不高兴并告诉你有些事情不应该是这样。

从您的代码来看,您似乎希望在表单级别处理 KeyDown 事件,因此您需要更改代码以具有处理 KeyDown 事件并恢复图片框原始签名的方法

public MainScreen()
{
    InitializeComponent();
    KeyDown += new KeyEventHandler(MainScreen_KeyDown);
    if (characterCreated == false)
    {
        playGameBtn.ForeColor = Color.Gray;

    }
}
private void pictureBox1_Click(object sender, EventArgs e)
{
     // REMOVE ALL THE CODE FROM THIS EVENT AND MOVE IT TO MainScreen_KeyDown  event
}
private void MainScreen_KeyDown(object sender, KeyEventArgs e)
{

    int x = pictureBox1.Location.X;
    int y = pictureBox1.Location.Y;

    if (e.KeyCode == Keys.Right)
    {
        x += 2;
    }
    else if (e.KeyCode == Keys.Left) 
    {
        x -= 2;
    }
    else if (e.KeyCode == Keys.Up)
    {
        y += 2;
    }
    else if (e.KeyCode == Keys.Down)
    {
        y -= 2;
    }

    pictureBox1.Location = new System.Drawing.Point(x, y);
}

此外,请记住,要在表单级别接收 KeyDown 事件,您需要将 Form.KeyPreview 属性 设置为 true