2013-07-18 31 views
1

所以我有形式Foo,并形式酒吧。假设我已经创建了一个Bar对象,将其初始化并显示它:如何等待一个单独的表单按钮事件

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

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

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

+0

传递给'Bar' – Marc

+0

我将如何做到这一点'Foo'的实例?创建一个内部Foo对象,然后将它作为参数? – amartin94

+0

你的问题是不完整的..你想要做什么..你从哪里调用显示'酒吧'.. – Anirudha

回答

4

既然你mentioned in commentsBar是当按钮被点击,你可以简单地使用现有的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(); 
+0

甜,感谢的人。我结束了使用FormClosed函数,因为我甚至不知道存在!谢谢你,谢谢你,谢谢你! – amartin94

1

您可以使用组成

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

} 

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

在酒吧您的活动,请拨打f.Method()

5

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

+1为highlighing'因此它减少耦合'+'你可以更容易地重用Bar'。 – Abhinav

相关问题