如何在表单之间共享事件处理程序

时间:2015-02-13 05:21:08

标签: c# forms event-handling

我有一个Form1.button1和Form2.button1。我希望两个按钮共享相同的事件处理程序,以便在单击它们时使用。请参阅form2.button1_Click事件处理程序中的注释。

Form1中

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

    private void button1_Click(object sender, EventArgs e)
    {
        textBox1.Text = "Hello World";
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Form2 form2 = new Form2(this);
        form2.Show();
    }
}

窗体2

public partial class Form2 : Form
{
    Form1 form1;
    public Form2(Form1 form1)
    {
        InitializeComponent();
        this.form1 = form1;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // how do I get the form2.button1_Click and the form1.button1_Click 
        // to share the same event handler?
    }
}

任何有关如何在表单之间进行通信的一般资源也将不胜感激。我目前所知道的是将变量和方法设置为公共,并将表单传递给其他表单。

3 个答案:

答案 0 :(得分:1)

如果您想将事件处理单一来源于一个方法,那么您需要通过其中一个按钮更改事件的订阅方式。快速执行此操作的方法如下:

  1. Form1中,使button1_Click() public代替private
  2. Form2中,将以下行添加到构造函数中:

    public Form2(Form1 form1)
    {
        InitializeComponent();
        this.form1 = form1;
        this.button1.Click += new EventHandler(this.form1.button1_Click);
    }
    

答案 1 :(得分:1)

鉴于两个类之间存在关系,即您已经将Form1引用传递给Form2类构造函数,您应该将Click事件作为新事件公开在{ {1}}。也就是说,用一个包装真实事件的单独事件封装实际事件。

例如:

Form1

这样,public partial class Form1 : Form { public Form1() { InitializeComponent(); } public event EventHandler Button1Click; private void button1_Click(object sender, EventArgs e) { textBox1.Text = "Hello World"; EventHandler handler = Button1Click; if (handler != null) { handler(this, EventArgs.Empty); } } private void button2_Click(object sender, EventArgs e) { Form2 form2 = new Form2(this); form2.Show(); } } public partial class Form2 : Form { Form1 form1; public Form2(Form1 form1) { InitializeComponent(); this.form1 = form1; this.form1.Button1Click += button1_Click; } private void button1_Click(object sender, EventArgs e) { // how do I get the form2.button1_Click and the form1.button1_Click // to share the same event handler? } } 中的具体实现可以在将来根据需要进行修改,而不需要任何其他需要您在其他地方修改代码的类的依赖。他们需要知道的是Form1Form1事件代表某种一般点击操作。

答案 2 :(得分:0)

我认为您需要的是在两种形式中执行相同的任务。例如:点击form1按钮以及form2

按钮更改文本框

一个更简单的解决方案,在public中公开form1方法,例如关注

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

    private void button1_Click(object sender, EventArgs e)
    {
        DoMyWork();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Form2 form2 = new Form2(this);
        form2.Show();
    }

    // Public method to desired work
    public void DoMyWork() (){
       textBox1.Text = "Hello World";
    }
}

form2中使用此方法,例如关注(因此您将form1传递给form2)

public partial class Form2 : Form
{
    Form1 form1;
    public Form2(Form1 form1)
    {
        InitializeComponent();
        this.form1 = form1;
        this.form1.Button1Click += button1_Click;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        form1.DoMyWork(); // perform same work
    }
}