如何以不同的形式订阅事件

本文关键字:事件 | 更新日期: 2023-09-27 18:13:03

我需要一些帮助来连接两个windows窗体。我需要的是,当按钮按下表单2,表单1将激活某些方法?我尝试使用事件,但我不能使它工作

如何以不同的形式订阅事件

public class Form1
{
   private Form2 form2;
   public Form1(Form2 frm2)
   {
      form2 = frm2;
      form2.ButtonClicked += button_clicked;
   }
   public void button_clicked(object sender, EventArgs e)
   {
      frm1btn_click(null, null);
   }
}
public class Form2
{
   public event EventHandler ButtonClicked;
   Public Form2()
   {
   }
   public void frm2btn_click(object sender, EventArgs e)
   {
      if(ButtonClicked != null)
      {
         ButtonClicked(null, null);
      }
   }
}
public class main
{
   public static void main(string[] args)
   {
      Form2 form2 = new Form2();
      Form1 form1 = new Form1(form2);
   }
}

这是事件的基本思想。当用户单击form2中的按钮时,您的事件将被触发。确保form1正在监听事件(即+=行)。

你的main方法应该实例化这两个表单。

还要注意这不是最佳实践。表单之间很少触发事件,您很可能需要一个底层模型模式。

如果有代码的话会更完整。

与其尝试处理按钮的Click事件(你可以简单地做到这一点),不如在Click事件处理程序中调用其他表单的方法:

    你应该有其他形式的引用来调用它的方法。
  • 其他形式的方法应该是public。

代码格式2:

//You should set form1Instance=... somewhere in code
Form1 form1Instance;
public void button1_Click(object sender, EventArgs e)
{
    //....
    form1Instance.Method1();    
}

Code In Form1:

Public void Method1()
{
    //...
}

您可以使用MVVM Light的概念。MVVM Light的Messenger组件可以方便地在类之间传递数据。

按以下步骤操作:

1)点击form2中的按钮,编写如下代码:

// Sends a message with a Student object.
var student = new Student{ FirstName = "Gul", LastName = "Ershad" };
Messenger.Default.Send(student);

2)接收来自form2form1的传入消息,编写如下代码:

// Registers for incoming Student messages.
Messenger.Default.Register<Student>(this, (student) =>
{
    // Works with the Student object.
});

阅读下面链接中的详细信息。在类之间传递消息的概念非常强大。

[MVVM Light][1]