如何在窗体之间共享事件处理程序



我有一个Form1.button1和Form2.button1。我希望两个按钮在单击时共享相同的事件处理程序。请参阅表单中的注释2.button_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();
    }
}

Form2

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

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

如果您想将事件处理单一源代码为一个方法,那么您需要更改其中一个按钮订阅事件的方式。一个快速的方法如下:

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

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

例如:

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中的特定实现可以在将来根据需要进行修改,而不需要任何其他类的任何依赖性,需要您在其他地方修复代码。他们只需要知道Form1有一个Button1Click事件,它表示某种一般的单击操作。

我认为您需要在两种形式中执行相同的任务。例如:从form1form2 的按钮点击更改文本框

一个更简单的解决方案,在form1中暴露一个类似于跟随的public方法

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

相关内容

  • 没有找到相关文章

最新更新