如何共享形式之间的事件处理程序(How to share an event handler betw

2019-10-21 21:07发布

我有一个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?
    }
}

对于如何形式之间通信的任何一般资源也将不胜感激。 所有我现在知道该怎么设置变量和方法为公众和形式传递给其他形式。

Answer 1:

鉴于这两个类之间的现有关系,即你已经传递Form1参考Form2类的构造函数,你应该让Click事件作为新事件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?
    }
}

这样一来,在具体实施Form1可以根据需要在将来会要求您在别处修复代码的任何其他类修饰,没有任何依赖性。 所有他们需要知道的是, Form1Button1Click代表某种一般性点击操作事件。



Answer 2:

如果你想单源的事件处理只有一个方法,那么你就需要更改的事件是如何通过一个按钮订阅。 一个快速的方法来做到这一点是:

  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); } 


Answer 3:

我想你需要的是两种形式执行相同的任务。 例如:从按钮,单击更改文本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到窗体2)

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
    }
}


文章来源: How to share an event handler between forms