【问题标题】:How to work with delegates and event handler for user control如何使用委托和事件处理程序进行用户控制
【发布时间】:2010-05-27 10:08:09
【问题描述】:

我创建了一个包含按钮的用户控件。 我在我的 winform 上使用这个控件,它将在从数据库中获取数据后在运行时加载。

现在我需要在该按钮的 Click 事件中从数据表中删除一行。

问题是我如何在我的表单中捕获该事件。目前它在该用户控件的 btn 点击事件定义中。

【问题讨论】:

    标签: c# user-controls event-handling delegates custom-event


    【解决方案1】:

    您可以通过在用户控件中执行以下操作来创建自己的委托事件:

    public event UserControlClickHandler InnerButtonClick;
    public delegate void UserControlClickHandler (object sender, EventArgs e);
    

    您使用以下方法从您的处理程序中调用事件:

    protected void YourButton_Click(object sender, EventArgs e)
    {
       if (this.InnerButtonClick != null)
       {
          this.InnerButtonClick(sender, e);
       }
    }
    

    然后您可以使用以下方法挂钩事件

    UserControl.InnerButtonClick+= // Etc.
    

    【讨论】:

    • Nice nick :),请您稍微解释一下。我不太了解委托、事件和接口。它是如何工作的。它如何识别一个按钮被点击了?
    • 基本上,委托只是指向一个指定的函数。委托是多播的,这意味着它们可以同时指向多个方法。 IE。调用一次委托将触发所有附加的方法。我没有必要解释接口,因为它们与这个问题无关,但是如果您进行搜索,那么在 SO 上有很多关于它们的问题。
    • 为什么我不能写公共事件 int funName;事件实际上接受了什么?
    • 你需要一个处理程序。您可以将委托(即处理程序)更改为公共委托 void FunName(int i);
    【解决方案2】:

    没有必要声明一个新的委托。在您的用户控件中:

    public class MyControl : UserControl
    {
      public event EventHandler InnerButtonClick;
      public MyControl()
      {
        InitializeComponent();
        innerButton.Click += new EventHandler(innerButton_Click);
      }
      private void innerButton_Click(object sender, EventArgs e)
      {
        if (InnerButtonClick != null)
        {
          InnerButtonClick(this, e); // or possibly InnerButtonClick(innerButton, e); depending on what you want the sender to be
        }
      }
    }
    

    【讨论】:

    • 您不需要在某处定义innerButton 吗?这是少了一块吗?
    • InnerButtonClick 由这一行定义:“public event EventHandler InnerButtonClick;”如果您不需要专门的事件处理程序,则无需重新定义基本事件处理程序。
    • 这个和上面的例子正是我想要的。完成连接事件的示例并展示客户端如何订阅会有所帮助。或许还可以在用户控件与自定义 EventArgs 上添加检索公共属性,但以上是常用的情况。
    【解决方案3】:

    只需现代化ChéDon 的答案,您可以在 2018 年做到这一点:

    public class MyControl : UserControl
    {
      public event EventHandler InnerButtonClick;
    
      public MyControl()
      {
        InitializeComponent();
        innerButton.Click += innerButton_Click;
      }
    
      private void innerButton_Click(object sender, EventArgs e)
      {
          InnerButtonClick?.Invoke(this, e);
          //or
          InnerButtonClick?.Invoke(innerButton, e); 
          //depending on what you want the sender to be
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多