2013-07-18 37 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

相關問題