.NET事件-什么是对象发送者和EventArgs e?


78

sender和eventArgs是什么意思?如何使用它们(针对以下情况)?

场景:

我正在尝试使用删除功能构建自定义控件,并且我希望能够删除在包含许多相同自定义控件的页面上单击的控件。


1
@rogerdeuce,我们在ASP.net c#项目上遇到了此问题,因此将其标记为c#。我还根据您的编辑注释添加了vb标签。
stringo0 2015年

Answers:


86

发件人是操作所针对的控件(例如OnClick,它是按钮)。

EventArgs是此事件的实现者可能有用的参数。使用OnClick时,它没有任何好处,但是在某些情况下,例如在GridView中“ SelectedIndexChanged”中说,它将包含新索引或其他有用数据。

克里斯在说什么,你可以这样做:

protected void someButton_Click (object sender, EventArgs ea)
{
    Button someButton = sender as Button;
    if(someButton != null)
    {
        someButton.Text = "I was clicked!";
    }
}

4
谢谢!您介意扩展eventargs还是提供有关它们的链接?例如,我可以通过eventargs传递字符串值吗?如果是这样,怎么办?
stringo0 2009年

5
好吧,“您”是发送事件的班级。因此,通常,您用自己的“ MyControlsEventEventArgs”子类化“ EventArgs”,然后在其上设置要传递的属性。因此,只有在编写发送事件的控件时,才将它们放在这里。如果要在按钮中放入字符串值,通常使用“ CommandArgument”字段,您可以通过将发送方转换为“ Button”来访问该字段(如我的文章)。
中午丝绸

21

sender引用调用触发事件处理程序的事件的对象。如果您有许多使用同一事件处理程序的对象,这将很有用。

EventArgs是一个虚拟的基类。它本身或多或少地无用,但是如果从中派生,则可以添加传递给事件处理程序所需的任何数据。

当您实现自己的事件时,请使用EventHandlerEventHandler<T>作为其类型。这样可以保证您在所有事件中都具有这两个参数(这是一件好事)。


8

手动将发送方转换为自定义控件的类型,然后使用它删除或禁用等。例如,如下所示:

private void myCustomControl_Click(object sender, EventArgs e)
{
  ((MyCustomControl)sender).DoWhatever();
}

“发送者”只是被操作(例如单击)的对象。

事件args为更复杂的控件(例如,树视图)子类化,因此您可以了解有关事件的更多详细信息,例如确切地单击它们的位置。


您能对此做一点扩展吗?如何处理发送者/事件参数?我不习惯使用它们。
stringo0

@ stringo0发送者是引发事件的对象(按约定传递“ this”来调用事件委托)。EventArgs,如果没有被子类化,则完全没有用。因此,除非您具有SelectedIndexEventArgs参数或CancelEventArgs,否则您将无法执行任何操作。如果您不习惯使用它们,则根本不需要它,但是您需要在方法签名中使用它们。因此,您只需忽略它们即可。如果你写一个lambda来处理你甚至都不需要编写这些参数的名字事件
USR-本地ΕΨΗΕΛΩΝ

5
  1. “发送者”被称为对象,它在某些控件上具有某些动作

  2. “事件”具有一些有关控件的信息,这些信息具有某些用户执行的行为和身份。当事件发生时,由于事件添加而产生的事件,将其保存在数组中称为事件agrs


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.