我在这里要做的事情非常简单,但对我来说并不适用。我已经查看了很多关于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 是否为控制器事件自动创建,甚至是必要的?我在网上看到的大多数例子都省略了它们。我只是保留它们,因为它们是默认创建的,但我真的不知道它们提供了什么样的功能,而且我从来不必在我的方法中使用这些参数。
谢谢大家! =)
答案 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);
}
否则,直接通过按钮名称(如果您知道的话)访问