使用对象发送器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());
}
这个用过吗?对事件处理程序有像样的解释吗?
以下签名
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;