【问题标题】:How do I can call event from usercontrol to main form如何从用户控件调用事件到主窗体
【发布时间】:2017-09-28 09:53:19
【问题描述】:

我有一个 userControl,那里有一个按钮,当我从 userControl 单击主窗体中的按钮时,我想调用事件。我这样做:

用户控制

public UserControlerConstructor()
{
    _button.Click += new EventHandler(OnButtonClicked);
}

public delegate void ButtonClickedEventHandler(object sender, EventArgs e);
public event ButtonClickedEventHandler OnUserControlButtonClicked;

private void OnButtonClicked(object sender, EventArgs e)
{
    // Delegate the event to the caller
    if (OnUserControlButtonClicked != null)
        OnUserControlButtonClicked(this, e);
}

表格

public Form1()
{            
    userControlInstance.OnUserControlButtonClicked += new EventHandler(OnUCButtonClicked);
}

private void OnUCButtonClicked(object sender, EventArgs e)
{
    throw new NotImplementedException();
}

它不起作用,因为当我在表单中单击时,在表单代码中什么都不做,但它在 userControl 代码中起作用。但我想用表单代码来做。我不知道如何从 userControl 调用事件到表单。

【问题讨论】:

  • 这个问题不是很清楚,但我的理解是你要求在表单控件中调用用户控件的事件。这是事件的一个限制,只有拥有类才能告诉何时到哪里调用事件。您只能在订阅类中注册事件处理程序。
  • 无关:为什么要使用自定义委托?你可以做到public event EventHandler OnUserControlButtonClicked
  • 是的,编译器不会停止它。
  • @Fildor 你是对的,错误的选择。 :)
  • 您的代码无法编译:EventHandler 无法转换为 ButtonClickedEventHandler

标签: c# winforms events user-controls


【解决方案1】:

现在我不知道你是否明确想要使用委托,不是吗?如果没有,你为什么不这样做:

public Form1()
    {            
        userControlInstance._button.Click += OnUCButtonClicked;
    }

private void OnUCButtonClicked(object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }

【讨论】:

    【解决方案2】:

    到目前为止,您的代码无法编译。您使用了错误的事件处理程序类型。它应该显示以下编译器错误:

    EventHandler 无法转换为 ButtonClickedEventHandler

    执行以下步骤:

    1) 将委托的声明放在类UserControlerConstructor之外:

    public delegate void ButtonClickedEventHandler(object sender, EventArgs e);
    
    public partial class UserControlerConstructor: UserControl
    {
    

    1) 然后在Form注册事件时改变handler的类型:

    public Form1()
    {            
        userControlInstance.OnUserControlButtonClicked += new ButtonClickedEventHandler(OnUCButtonClicked);
    }
    

    这样应该可以工作

    【讨论】:

      猜你喜欢
      • 2020-10-10
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      相关资源
      最近更新 更多