【问题标题】:How to wait for a button event in a separate form如何以单独的形式等待按钮事件
【发布时间】:2013-07-19 01:35:21
【问题描述】:

所以我有表单 Foo 和表单 Bar。假设我已经制作了一个 Bar 对象,对其进行初始化并显示它:

Bar b = new Bar();
b.Show();

Bar 有一个按钮。我需要使用一个事件,当它被推送时,会触发 Foo 中的一些代码。我无法从 Bar 内部创建新的 Foo 对象,因为已经有活动变量等。

有什么想法吗?

编辑: 更简单的方法是在 b.Show() 之后停止代码,然后等到被调用的窗口执行 this.Close();有没有办法做到这一点?

【问题讨论】:

  • Foo的实例传递给Bar
  • 我该怎么做?创建一个内部 Foo 对象,然后将其作为参数?
  • 你的问题不完整..你想做什么..你在哪里打电话给bar..
  • 一个更简单的方法是在 b.Show() 之后停止代码,然后等到被调用的窗口执行 this.Close();有没有办法做到这一点?
  • @Anirudh 如果实施得当,您不需要知道或关心。

标签: c# .net winforms


【解决方案1】:

Bar中声明一个新事件:

public event EventHandler SomethingHappened;

private void OnSomethingHappened()
{
    var handler = SomethingHappened;
    if (handler != null)
        handler(this, EventArgs.Empty);
}

并在按钮的事件处理程序中触发它:

private void TheButton_Click(object sender, EventArgs e)
{
    OnSomethingHappened();
}

Foo,订阅事件:

Bar b = new Bar();
b.SomethingHappened += Bar_SomethingHappened;
b.Show();

...

void Bar_SomethingHappened(object sender, EventArgs e)
{
    // Do whatever you need to do...
}

这种方法比将Foo 的实例传递给Bar 更好,因为这种方式Bar 不必了解Foo 的任何信息,因此它减少了耦合。此外,您可以更轻松地从另一个表单重用Bar

【讨论】:

  • +1 用于突出显示so it reduces coupling + you can more easily reuse Bar
【解决方案2】:

由于您mentioned in comments Bar 是一个在单击按钮时关闭的表单,您可以简单地使用现有的FormClosed 事件而不是定义您自己的事件:

Bar b = new Bar();
b.Show();
b.FormClosed += (s, args) => DoStuff();

如果您想在单击按钮时执行一些操作并且不会同时关闭表单,那么您可以在Bar 中定义一个自定义事件,可以像这样完成:

public class Bar
{
    public event Action MyButtonClicked;
}

然后在单击按钮时触发该事件:

public void buttonClicked(object sender, EventArgs args)
{
    if(MyButtonClicked != null) MyButtonClicked();
}

然后Foo 可以订阅该事件:

Bar b = new Bar();
b.Show();
b.MyButtonClicked += () => DoStuff();

【讨论】:

  • 很好,谢谢。我最终使用了 FormClosed 函数,因为我什至不知道它的存在!谢谢谢谢谢谢!
【解决方案3】:

你可以使用合成

public class Bar
{
  private Foo f; 
  public Bar(Foo value)
  {
    f = value;
  } 

}

Foo f = new Foo(); 
Bar b = new Bar(f);

在酒吧的活动中,请致电f.Method()

【讨论】:

    猜你喜欢
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多