如何在自定义控件中创建一个按钮来触发onClick事件并在自定义控件所在的主窗体中处理它?

时间:2014-05-03 19:56:40

标签: c#

在C#中,我创建了一个继承自UserControl的自定义控件,并在自定义控件中添加了一个按钮btnInTrayMap。 然后我将自定义控件添加到主窗体。主窗体有另一个按钮,用于比较它们的行为。 我观察到的是,主窗体上的按钮在单击时工作正常。但是,驻留在自定义控件中的按钮btnInTrayMap在单击时根本不响应。

我在自定义控件中有以下代码:

public partial class TrayMap : UserControl
{                      
    public TrayMap()
    {                                    
        InitializeComponent();               
    }        

    public event EventHandler MyCustomClickEvent;

    protected virtual void OnMyCustomClickEvent(object sender, EventArgs e)
    {            
        if (MyCustomClickEvent != null)
            MyCustomClickEvent(this, e);
    }

    private void btnInTrayMap_Click(object sender, EventArgs e)
    {            
        OnMyCustomClickEvent(sender, EventArgs.Empty);            
    } 
}

我相信TratMap.designer.cs中的btnTrayMap.Click事件处理程序可能导致了这个问题:

this.btnInTrayMap.Click += new System.EventHandler(this.btnInTrayMap_Click);

在主窗体中,我有以下代码:

public partial class Form1 : Form
{        
    public Form1()
    {
        InitializeComponent();
    }

    private void btnInForm_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Test Button In Form", "btnInForm Button Clicked", MessageBoxButtons.OK);
    }

    public void MyCustomClickEvent(object sender, EventArgs e)
    {
        Button button = sender as Button;
        MessageBox.Show("Test Button In TrayMap", button.Text + " Button Clicked", MessageBoxButtons.OK);
    }
}

我想知道如何设置事件委托,以便在单击按钮btnInTrayMap时执行主窗体中的MyCustomClickEvent方法。 谢谢。

1 个答案:

答案 0 :(得分:1)

您尚未在主表单中注册活动。试试这种方式。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        trayMap.MyCustomClickEvent += MyCustomClickEvent;  // i'm assuming trayMap is the name of user control in main form.
    }

    private void btnInForm_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Test Button In Form", "btnInForm Button Clicked", MessageBoxButtons.OK);
    }

    private void MyCustomClickEvent(object sender, EventArgs e)
    {
        Button button = sender as Button;
        MessageBox.Show("Test Button In TrayMap", button.Text + " Button Clicked", MessageBoxButtons.OK);
    }
}