【问题标题】:How to subscribe to an event in a different form c#如何以不同的形式订阅事件c#
【发布时间】:2015-09-15 17:04:17
【问题描述】:

我需要一些帮助来连接两个窗体。我需要的是,当在表格 2 中按下按钮时,表格 1 会激活某些方法?我尝试使用事件,但无法使其工作。

【问题讨论】:

  • 在此处显示您的试用代码
  • 它们是同一个项目中的两个窗体还是单独的应用程序?
  • 你要触发事件吗?

标签: c# winforms events


【解决方案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 方法应该实例化这两种形式。

另外请注意,这不是最佳做法。表单相互触发事件并不常见,您很可能需要一个底层模型架构。

如果有代码,这也会更完整。

【讨论】:

    【解决方案2】:

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

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

    表格 2 中的代码:

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

    Form1 中的代码:

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

    【讨论】:

    • 这假设 Form1 在 Form2 中实例化。通常情况正好相反。例如,MainWindow 窗体实例化 Options 窗体,并且您希望 Options 中的事件触发 MainWindow 中的方法。所以也许oppassum的回答更中肯。
    • @A.Vieira 它假设在Form2 的某个地方你有form1Instance = new Form1();。如果您对扩展答案感兴趣,请查看this post。
    • 不要混淆Form1和Form2,名字应该是相反的:D
    【解决方案3】:

    您可以使用 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) 接收 form2 到 form1 的传入消息并编写如下代码:

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

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

    [MVVM Light][1]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 2010-09-07
      • 1970-01-01
      相关资源
      最近更新 更多