【问题标题】:How is an event parameter passed?事件参数如何传递?
【发布时间】:2013-09-17 06:26:46
【问题描述】:

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

    protected override void OnPaint(PaintEventArgs e)
    {

    }

我不明白PaintEventArgs 是如何生成的,以及它是如何/何时传递给这个函数的。我必须假设每次表单需要重新绘制时都会调用OnPaint()

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

    private void button1_Click(object sender, EventArgs e)
    {

    }

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

【问题讨论】:

  • 一个覆盖受保护的虚拟方法,而另一个是附加到事件的典型事件处理程序。你在 OnPaint 中被称为 PaintEventArgs 的事实在我看来是实现者的纯粹懒惰/实用主义,并且不遵循任何约定。

标签: c# .net events


【解决方案1】:

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

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

OnPaint 有两个作用:

  1. 引发Paint 事件,以便通知外部订阅者(这就是假设的form1_Paint 最终会被调用的方式)。
  2. 让派生类直接响应绘制事件而无需涉及事件处理程序 - 只需重写方法(但派生类不能忘记调用基实现!)。

当需要引发Paint 事件时,基类中的其他一些代码会根据手头的信息创建一个PaintEventArgs 实例并调用OnPaint

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

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

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

【讨论】:

    【解决方案2】:

    对于按钮单击事件处理程序,object sender, EventArgs e 语法允许将多个按钮连接到单个事件处理程序。这是可能的,因为sender 是发起事件的对象,因此您可以区分是按钮1、按钮2 还是按钮3 发起了事件。

    由于senderobject,那么您可以想象有一个单击处理程序来处理所有可单击的页面元素,并在处理程序中有一堆条件逻辑根据控制类型进行切换发起事件;但不建议这样做。

    【讨论】:

      【解决方案3】:

      最好的起点是(重新?)熟悉.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

      【讨论】:

      • -1 用于发布 .NET 1.1 链接。当读者开始点击该页面的链接时会发生什么?
      • @retailcoder - 谢谢 - 当我的互联网连接中断时,我正在处理这个问题。现在更新了:)
      猜你喜欢
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2017-02-05
      • 1970-01-01
      • 2013-10-15
      • 2017-01-05
      相关资源
      最近更新 更多