当我手动将对象发送者和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());
}
这是否曾被使用过?对那里的事件处理程序有一个不错的解释吗?
答案 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;