【问题标题】:Event sender from custom control来自自定义控件的事件发送者
【发布时间】:2010-11-04 10:08:29
【问题描述】:

我有一个扩展UserControl 的控件。此控件包含两个 ComboBox 控件。我创建了一个事件处理程序,当任何一个组合发生变化时都会触发:

public event EventHandler ComboChanged { add { cmbA.SelectedIndexChanged += value; cmbB.SelectedIndexChanged += value; } remove {...} }

当我向此事件添加事件处理程序时,有什么方法可以将 sender 报告为自定义控件(即 ComboBox 的父控件)而不是 ComboBox 本身?还是我正在尝试做一些我不应该在这里做的事情?

【问题讨论】:

    标签: c# winforms events custom-controls


    【解决方案1】:

    你应该有这样的东西:

    public event EventHandler MyControlChanged
    

    然后在您的 userControl 中为每个 ComboBox 提供两个函数

    protected void oncmbA_SelectedIndexChanged(object sender, EventArgs e)
    {
       if (MyControlChanged!=null)
         MyControlChanged(this, e);//or some new Eventagrs that you wish to communicate
    }
    
    protected void oncmbB_SelectedIndexChanged(object sender, EventArgs e)
    {
       if (MyControlChanged!=null)
         MyControlChanged(this, e);//or some new Eventagrs that you wish to communicate
    }
    

    这将引用 UserControl 而不是触发 UserControl 事件的组合框。

    【讨论】:

      【解决方案2】:

      Yoann 的回答是要走的路。这是一个类似的模式,但有一些细微的差别。

      // Default listener makes null-check unnecessary when raising event.
      // Note that no custom implementations are provided for add, remove.
      public event EventHandler ComboChanged = delegate { };
      
      ...
      
      foreach(var comboxBox in new[] {cmbA, cmbA})
      {
        // Attach listener to combo-box's event that raises our own event.
        // Lambda-expression is ok since we don't intend to ever unsubscribe.
        comboBox.SelectedIndexChanged += (sender, args) => ComboChanged(this, args);
      }
      

      【讨论】:

      • 不过你的更优雅;)
      • 谢谢,有替代品总是有用的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多