"object sender"和"EventArgs e"参数有什么用?

65
Page_LoadInit和其他页面事件中,这些(object sender, EventArgs e)参数有什么用处?例如会更有帮助。
2个回答

68

EventArgs e是一个包含事件数据的参数,称为e,有关更多信息,请参见EventArgs MSDN页面。

Object Sender是一个名为Sender的参数,它包含引发事件的控件/对象的引用。

EventArgs类: http://msdn.microsoft.com/en-us/library/system.eventargs.aspx

示例:

protected void btn_Click (object sender, EventArgs e){
   Button btn = sender as Button;
   btn.Text = "clicked!";
}

编辑: 当按钮被单击时,btn_Click事件处理程序将被触发。"object sender"部分将是对所单击的按钮的引用


1
但是发送者与按钮有什么关系呢?senderbtn之间的关系在哪里构建? - Eduardo Pignatelli
@EduardoPignatelli,“sender”和“Button”在继承层次结构中的关系是它们都是“object”类型。 “sender”只是一个“object”类型的包装器。在运行时解包时,被包装对象的底层实例将被投影到捕获类中。在这种情况下是“Button”。如果预期的类与解包对象不匹配,则会抛出异常。 - Leo Gurdian

40

按照惯例,这两个参数(或其变体)会随所有事件一起发送。

  • sender:引发事件的对象
  • eEventArgs 的一个实例,在许多情况下,它包括从 EventArgs 继承的对象。包含有关事件的其他信息,并且有时提供了用于修改事件的代码处理的能力。

在您提到的事件中,这两个参数都不是特别有用的。只有一个页面引发事件,而 EventArgsEmpty,因为没有关于事件的进一步信息。

分别查看这两个参数,以下是它们有用的一些示例。

sender

假设表单上有多个按钮。 这些按钮可以包含描述单击它们应该执行什么操作的 Tag。 您可以使用相同的处理程序处理所有 Click 事件,并根据 sender 执行不同的操作。

private void HandleButtonClick(object sender, EventArgs e)
{
    Button btn = (Button)sender;
    if(btn.Tag == "Hello")
      MessageBox.Show("Hello")
    else if(btn.Tag == "Goodbye")
       Application.Exit();
    // etc.
}

免责声明:这是一个编造的例子,请勿模仿!

e

有些事件可以被取消。它们发送CancelEventArgs而不是EventArgs。该对象在事件参数上添加一个简单的布尔属性Cancel。处理此事件的代码可以取消事件:

private void HandleCancellableEvent(object sender, CancelEventArgs e)
{
    if(/* some condition*/)
    {
       // Cancel this event
       e.Cancel = true;
    }
}

9
支持可取消事件(Cancellable Events)+1。在Windows应用程序世界中,有哪些现实世界的例子呢?谢谢。 - Sabuncu
@DaveKelly 谢谢。 - Sabuncu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接