无法将Button作为参数传递

时间:2014-03-18 16:45:32

标签: c# winforms events

我在这里要做的事情非常简单,但对我来说并不适用。我已经查看了很多关于stackoverflow和其他问题的非常相似或匹配问题的例子,他们的解决方案对我没用。

基本上(以非常简化的形式),我有一个带有一些文字的按钮。我喜欢它,所以单击此按钮时,会出现一个消息框,显示文本。但是,我有9个按钮(想想计算器上的数字),我想创建一个处理所有这些点击的方法,并根据按钮输出正确的文本..这就是我需要的原因将按钮作为参数传递。

这是我到目前为止处理它的方法的代码:

private void btn_Click(object sender, EventArgs e, Button b)
{
    MessageBox.Show(b.Text);
}

上面的小代码片段与其他人使用并且有效的解决方案相同。但是,对我来说,这段代码没有编译,并显示一条错误,上面写着'btn_Click'没有重载与委托'System.EventHandler'匹配。

当我双击该错误时,它会将我带到表单的Designer.cs页面,这是包含错误的代码行:

this.btnN7.Click += new System.EventHandler(this.btnN7_Click);

我不知道重载和委托部分是什么意思,抱歉,我对此很新。我想也许重载可能与构造函数有关,但即使这是正确的,我也不确定下一步会是什么。

我已正确包含 System.Windows.Forms; ,因此问题不应该是无法识别Button对象。

如果你可以提供任何关于我错过或做错的见解,那就太好了!如果您需要任何其他信息,请与我们联系。

最后,这与我的问题无关,但这是一个小问题,自从我一周前开始使用VS以来,我一直很烦恼:控制参数对象发件人 EventArgs e 是否为控制器事件自动创建,甚至是必要的?我在网上看到的大多数例子都省略了它们。我只是保留它们,因为它们是默认创建的,但我真的不知道它们提供了什么样的功能,而且我从来不必在我的方法中使用这些参数。

谢谢大家! =)

3 个答案:

答案 0 :(得分:4)

您只需使用sender参数。如果方法签名与EventHandler代理不匹配,您就无法订阅事件处理程序。

private void btn_Click(object sender, EventArgs e)
{
   var currentButton = sender as Button;
   if(currentButton != null) MessageBox.Show(currentButton.Text);
}

sender将被分配给触发事件的对象。例如,当您点击button2时,它将被分配到button2。当然,您需要附加此事件button2点击事件的处理程序。我还使用了as运算符来确保按钮被触发事件。将来如果你像{{1}那样手动调用此方法然后显式强制转换将抛出btn_Click(this, EventArgs.Empty)。使用InvalidCastException运算符总是更好地避免这种情况。如果as的类型不同于{{ 1}}然后sender null

答案 1 :(得分:3)

  

这就是我需要将按钮作为参数传递的原因。

你真的不必创建额外的参数。你需要的就是那里。

object sender是该事件的来源,因此请致电

var btn = (Button) sender;
MessageBox.Show(btn.Text);

你应该没事。

  

是否为控制器事件自动创建的控制参数object sender和EventArgs e是否必要?

所以现在你对这个问题有一个答案的一部分。传递附加信息需要第二部分(EventArgs)。阅读MSDN上有关事件参数的更多信息。

答案 2 :(得分:1)

这里有两个选项:

  • 如果您想要访问触发事件的按钮,可以通过sender

    执行此操作
    private void btn_Click(object sender, EventArgs e)
    {
        Button b = (Button)sender;
        MessageBox.Show(b.Text);
    }
    
  • 否则,直接通过按钮名称(如果您知道的话)访问