使用对象发送器EventArgs在事件处理程序中

本文关键字:事件处理 程序 EventArgs 对象 | 更新日期: 2023-09-27 18:14:05

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

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());
}        

这个用过吗?对事件处理程序有像样的解释吗?

使用对象发送器EventArgs在事件处理程序中

以下签名

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

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

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

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

对于XXArgs部分,它包含有关事件的信息。实际上不应该强制转换它,而是用正确的签名编写处理程序。基本上,对于鼠标单击按钮,事件处理程序的正确签名将是:

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

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

Button button1 = sender as Button;

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

请注意,它仍然可能是比Button更"具体"或更具体的东西,然后您将需要不同的强制转换来获得更多派生成员。

也可以在保护无效Page_Load(对象发送者,EventArgs e)的情况下强制转换页面

var sendinfo = (Page)sender;