Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在窗体之间共享事件处理程序_C#_Forms_Event Handling - Fatal编程技术网

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

C# 如何在窗体之间共享事件处理程序,c#,forms,event-handling,C#,Forms,Event Handling,我有一个Form1.button1和Form2.button1。我希望两个按钮在单击时共享相同的事件处理程序。请参阅form2.button1\u Click事件处理程序中的注释 表格1 表格2 任何关于如何在表单之间进行通信的通用资源也将不胜感激。我目前所知道要做的就是将变量和方法设置为public,并将表单传递给其他表单。如果您想将事件处理单一来源于一个方法,则需要更改其中一个按钮订阅事件的方式。实现这一点的快速方法如下: 在表单1中,将按钮1\u单击()设置为公共,而不是私有 在表单2中,

我有一个Form1.button1和Form2.button1。我希望两个按钮在单击时共享相同的事件处理程序。请参阅form2.button1\u Click事件处理程序中的注释

表格1

表格2


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

如果您想将事件处理单一来源于一个方法,则需要更改其中一个按钮订阅事件的方式。实现这一点的快速方法如下:

  • 表单1
    中,将
    按钮1\u单击()
    设置为公共
    ,而不是
    私有
  • 表单2
    中,向构造函数添加以下行:

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

  • 考虑到两个类之间的现有关系,即您已经将
    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
    中的具体实现可以在将来根据需要进行修改,而不需要任何其他类依赖于您在其他地方修复代码。他们需要知道的是,
    Form1
    有一个
    按钮1单击
    事件,它代表某种一般的单击操作。

    我认为您需要的是在两种表单中执行相同的任务。例如:从
    form1
    的按钮点击和从
    form2

    一个更简单的解决方案是在
    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)


    你能澄清一下吗?我看到你收到的答案与我对你的问题的理解不同,我想知道我是否正确理解了这个问题。您想用一个方法来处理
    Form1
    Form2
    中按钮的点击,还是想用两个不同的处理程序来响应
    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?
        }
    }
    
    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";
        }
    }
    
    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
        }
    }