2009-10-01 223 views
0

情況:C#,.NET 3.5,WinForms的C#Winforms:將一種功能從一種形式傳遞給另一種形式?

目的:Form1上具有可通過構造方法來啓用一個按鈕。 I.E.只有在我調用新的Form1(true)時纔會顯示該按鈕。 我們希望能夠通過Form2中的一些參數傳遞給Form1(不必在Form1的構造函數中),並且當按下Form1.Button1時,應該執行Form2.<SomeMethod>

我們知道,我們可以在Form1中創建一個代表/事件,並從窗體2做這樣的事情:

Form1.SomeDelegate += new ..... (MyMethodInForm2); 

...然後在Form1_ButtonClick我們火,這反過來會做魔術在窗體2的事件。

但我們想知道是否有更優雅/新/現代的版本(匿名方法?Lambda表達式?等)來完成此操作。

這個想法是,「任何」窗體可以instanciate Form1類,並傳遞自己的方法來執行時單擊Form1的按鈕;但不是對調用方的回調(form2,3,.. n),Form1會執行傳遞的函數(可能駐留在調用方內)。現在我們確實不需要這些函數來獲取參數。

注意:代碼示例包含簡單的變量/對象名稱,並不從現實生活中取得,請忽略簡單性。

UPDATE對不起,不是更具體的,我想我會繼續使用該委託/事件模型,但作爲參考,這就是我認爲是situtation的一個更好的描述:

Form1的是一種通用的形式,接受項目列表並顯示它們。我們可能會傳遞員工類型或人員類型或任何「T」。它工作正常。 我們收到客戶的一個要求,詢問是否可以向該小Form1添加一個可選按鈕,如果點擊它,它將打開另一個表單/執行某種方法。

這樣,如果我使用Form1,我可以在運行時告訴按鈕打開EmployeeForm,而如果我使用Form1,則同樣的按鈕可以打開窗體PersonForm。現在打開表單並不是我們對該按鈕的唯一使用,但這是調用者的問題。

現在,我所做的就是我們所說的:在該Form1上的委託/事件和在「調用」窗體上我們做一個Form1.theEvent + =的東西,以訂閱該事件。我只是想知道是否有更好的方法來實現這一點,因爲這是我們如何在.NET 2.0中完成的,並且我們剛剛開始使用.NET 3.5。

+0

我想,我也希望讓更多的「API」不僅僅是友好讓API用戶知道他必須訂閱XX事件... –

回答

1

這聽起來像你描述了同樣的事情兩次。

訂閱一個事件確實是這樣 - 將一個函數傳遞給Form1,然後在引發該事件時執行該函數。

如果需要,您可以使用lambda表達式來訂閱事件,但您不必這樣做。

當然,如果您願意,您可以將代理作爲Form1構造函數參數,但在這種情況下,我看不到這麼做的好處。

簡而言之:我認爲正常事件可以滿足您的一切需求。如果您有要求哪些事件不要處理,請提供更多信息。

+0

我猜它的美學取決於Form1 ALWAYS是否使用這種委託。如果是這樣,在構造函數中傳遞一些東西會使它具有更多的美感,因爲它將需求綁定到API中。然而,它是可選的,這種形式可以以其他方式使用,然後Jon表示沒有理由以另一種方式做到這一點。 – Quibblesome

1

不完全確定你的表單是什麼意思,但你可以發送一個Func。例如:

public class MyForm<T> 
{ 

    private readonly Func<T, bool> predicate; 

    public MyForm(Func<T, bool> predicate) { this.predicate = predicate } 

    private void SomeMethod() 
    { 
     bool result = predicate(); 
     // Do something 
    } 
} 

var form = new MyForm(x => x.Number < 5); 
+0

你也可以使用行動,它將永遠返回無效或謂詞它總是會返回布爾 – Jabezz

0

1st:您應該在Form1中聲明一個公共事件。
第二:你應該調用它發送到Form1的事件,如Button1_Click

+0

喬恩,如果他需要在某個特定的時間開始這樣做,或者它並不總是將它作爲參數傳遞,或者在lambda表達式中可能會降低速度。 – Behrooz

0

從我所知道的,Form2是一個Form1可以更新的非模態對話框。但是Form2可能尚未創建。

完成更新Form2的顯而易見的方法是使用事件模型,使用Composition並將Form1傳遞到其構造函數中。

你可以使用委託和存儲,但我不能看到如何最好是傳遞一個參考父窗體英寸

如果你想Form2的更新任何類型,那麼一個簡單的界面將解決問題。

0

另一種方法是由一般的形式確定了「代理事件」暴露出按鈕的Click事件:

public class MyForm<T> : Form 
{ 

    public event EventHandler MyClick 
    { 
     add { this.theButton.Click += value; } 
     remove { this.theButton.Click -= value; } 
    } 

    // ... 
} 
相關問題