如何传递事件参数?

时间:2013-09-12 18:14:03

标签: c# .net events

我注意到在C#中我可以覆盖Form()父类中的方法,如下所示:

    protected override void OnPaint(PaintEventArgs e)
    {

    }

我不明白如何生成PaintEventArgs以及如何/何时将其传递给此函数。我必须假设每次表格需要重新绘制时都会调用OnPaint()

此外,当我创建按钮按下事件时,它们看起来像这样:

    private void button1_Click(object sender, EventArgs e)
    {

    }

再一次,我不明白激活按钮点击时这些参数是如何/为什么传递的。

3 个答案:

答案 0 :(得分:12)

没有什么特别之处。定义Paint事件的基类包含与此类似的代码:

protected virtual void OnPaint(PaintEventArgs e)
{    
    var paintHandlers = this.Paint;
    if (paintHandlers != null)
    {
        paintHandlers(this, e);
    }
}

OnPaint有两个功能:

  1. 引发Paint事件,以便通知外部订阅者(这是假设的form1_Paint最终会被调用的方式)。
  2. 让派生类直接响应绘制事件而不需要涉及事件处理程序 - 只需覆盖该方法(但派生类不能忘记调用基本实现!)。
  3. 当提升Paint事件时,基类中的其他一些代码会根据手头的信息创建一个PaintEventArgs实例并调用OnPaint

    // ...somewhere in the class...
    OnPaint(new PaintEventArgs(...));
    

    在将事件参数键入为EventArgs的特殊情况下,无需创建新实例,您可以直接将EventArgs.Empty静态成员传递给OnSomething方法。

    对于发生这种情况时:每当从应用程序的message pump中提取消息并进行处理时,都会指示应该引发该事件。您可能还想阅读Understanding events and event handlers in C#

答案 1 :(得分:1)

最好的起点是(重新)熟悉.Net“代表”:

例如,如果您查看C#表单的代码,您可能会看到如下内容:

private void btnGo_Click(object sender, EventArgs e)
{
    // My code goes here...

现在,如果您查看相应的自动生成的.Design代码,您会看到以下内容:

private void InitializeComponent()
{
    this.btnGo.Click += new System.EventHandler(this.btnGo_Click);
    ....

“+ =”语法将自定义事件处理程序分配给按钮。任何关于“代表”的教程(包括我上面引用的链接)都会为您提供有关其工作方式和原因的更多详细信息。

我希望有帮助.. PSM

答案 2 :(得分:1)

对于按钮单击事件处理程序,object sender, EventArgs e语法允许将多个按钮连接到单个事件处理程序。这是可能的,因为sender是启动事件的对象,因此您可以区分button1,button2或button3是否启动了事件。

由于sender是一个object,所以你可以设想一个单击处理程序来处理所有可点击的页面元素,并在处理程序中有一堆条件逻辑来切换什么类型的控制发起了事件;不建议这样做。