使用"对象发送者,EventArgs e"在事件处理程序中

时间:2014-07-21 09:07:15

标签: c#

当我手动将对象发送者和Eventargs e转换为类似下面的类时,我正在做什么?我知道它允许我访问已经传递的所有参数,也可以操作对象发送者(如下所示):

private void Button1_Click(object sender, EventArgs e)
{
    / /casting the arguments
    MouseEventArgs eventargs = e as MouseEventArgs;
    Button button1 = sender as Button;
    // displays which mouse button I used
    MessageBox.Show(eventargs.Button.ToString());
    // displays the name of the button I clicked
    MessageBox.Show(button1.Name.ToString());
    // changes the text of the button
    button1.Text = "Ive changed";
}

我觉得我不明白它是如何工作的,只是它有效。

此外,编写一个事件处理程序似乎很容易,该处理程序为同一类型的多个对象提供服务,但不能处理可处理不同类型事件或不同类型对象的事件,即:

private void Generic_Event_Handler(object sender, EventArgs e)
{
    // displays what object and event triggered the handler
    MessageBox.Show(sender.ToString());
    MessageBox.Show(e.ToString());
}        

这是否曾被使用过?对那里的事件处理程序有一个不错的解释吗?

4 个答案:

答案 0 :(得分:1)

以下签名

private or protected void EventHandlersName (object sender, EventArgs e)

是签名,他们拥有.NET中的所有事件处理程序。名为sender的参数与引发名为e的事件的对象相关联。

  

为什么sender的类型为object

因为.NET中的所有类型的基类型都是System.Object类型。因此,如果我们在win表单上的按钮上,或者在WPF应用程序或ASP.NET Web表单按钮中有单击事件,它就没有任何区别。

  

为什么我们应该手动转换对象发件人?

我们应该这样做,以便我们可以访问我们在每种情况下具有的特定类型的属性和方法。

例如,所有控件都可能没有名为Name的属性。此外,名为System.Object的基本类型没有。因此,如果您不将对象发送者强制转换为Button类,则无法读取其名为Name的属性。

答案 1 :(得分:0)

.Net中的事件处理程序的签名是(或至少应该是):

(object sender, XXArgs e)其中XXArgs是一个继承自EventArgs的类。

sender是事件的发件人。在您的示例中,如果单击某个按钮,该按钮将使用自己的实例引用(this)为sender参数触发事件(因此sender是对按钮的引用)。这很有用,因为您不需要存储对事件发送者的引用;它可以在事件处理程序中使用。

对于XXArgs部分,它包含有关该事件的信息。你不应该实际抛出它,而是用正确的签名编写你的处理程序。 基本上,对于mouse click on a button,事件处理程序的正确签名是:

private void Control_MouseClick(Object sender, MouseEventArgs e)
{
}

答案 2 :(得分:0)

sender是对object类型的引用。它所指的实际对象可以是任何东西; (在事件处理程序的特定情况下,如果一切正常,它应该引用生成事件的控件)。当你说:

Button button1 = sender as Button;

您正在尝试使用Button引用来引用相同的基础对象。如果底层对象是兼容的(即:是Button),那么button1引用将使您能够利用底层对象的Button成员。否则,使用sender引用,您将只能使用基础对象的object成员。

请注意,它仍然可能比Button更“具体”或具体,然后你需要一个不同的演员来获得更多的派生成员。

答案 3 :(得分:0)

还可以在受保护的无效Page_Load(对象发送者,EventArgs e)的情况下投射页面

var senderInfo =(Page)sender;