2017-04-12 79 views
0

我有一個簡單的菜單,其中的按鈕。每個按鈕打開另一個表單。用相同的邏輯處理幾種方法是否有一種常見的做法?

public void apartmentDetailsButton_Click(object sender, EventArgs e) 
{ 
    using (var form = new ApartmentDetails.View()) 
    { 
     form.ShowDialog(this); 
    } 
} 
public void remindersButton_Click(object sender, EventArgs e) 
{ 
    using (var form = new Reminders.View()) 
    { 
     form.ShowDialog(this); 
    } 
} 
public void paymentsButton_Click(object sender, EventArgs e) 
{ 
    using (var form = new Payments.View()) 
    { 
     form.ShowDialog(this); 
    } 
} 
public void documentsButton_Click(object sender, EventArgs e) 
{ 
    using (var form = new Documents.View()) 
    { 
     form.ShowDialog(view); 
    } 
} 

正如您所看到的,除了包含所需表單的命名空間外,事件處理程序幾乎完成同樣的事情。現在,如果我有更多的按鈕呢?我應該每次都真的複製粘貼這個方法嗎?

是否有可能爲所有按鈕使用一個事件處理程序或概括現有的處理程序?

+1

您可以讓一個事件方法處理多個按鈕。只需使用'+ ='更改註冊事件的方法名稱即可。 – jdweng

+0

謝謝。我怎麼知道要引用哪個名稱空間? – Sipo

+0

@Sipo:發件人參數是對被點擊的按鈕的引用 - 所以你可以檢查以查看哪個命名空間是必需的。 – PaulF

回答

3

假設所有類型的實現或從一個共同的類型派生的,你可以聲明的方法是這樣的:

public void DisplayForm(CommonType f) 
{ 
    using(var form = f.View()) 
    { 
     form.ShowDialog(view); 
    } 
} 

,並調用它像:

DisplayForm(new Documents()); 

CommonType應該是包含View方法之一。

爲了減少事件處理程序的數量,你可以聲明一個事件處理程序,並檢查sender類型:

public void OnButtonClick(object sender, EventArgs e) 
{ 
    if(sender is ApartmentDetails) 
    { 
     DisplayForm(new ApartmentDetails()); 
    } 
    ... 
} 
+0

即使使用泛型方法OP也需要爲每個按鈕創建自己的事件處理程序 – Fabio

+2

爲什麼它需要是一個通用方法而不是'public void DisplayForm(ICommonInterface f)'? – KMoussa

+0

@KMoussa你是對的,那也可以。我猜這個場景乍看之下似乎是一個完美的地方使用泛型:) –

1

因爲你的事件處理器處理不同類型的,你不能爲所有的按鈕一個事件處理程序。

一個可以使用的Activator.CreateInstance解決方法,但只有在情況下,當所有形式可以用相同簽名的構造函數來創建

public void OnClick(Type viewType, Form parent) 
{ 
    using (var form = (Form)Activator.CreateInstance(viewType)) 
    { 
     form.ShowDialog(parent); 
    } 
} 

然後在構造函數中使用它的所有按鍵

apartmentDetailsButton.Click += (sender, args) => OnClick(typeof(ApartmentDetails.View), this); 
remindersButton.Click += (sender, args) => OnClick(typeof(Reminders.View), this);  
paymentsButton.Click += (sender, args) => OnClick(typeof(Payments.View), this);  

您可以通過在button.Tag

private void OnButtonClick(object sender, EventArgs args) 
{ 
    var button = (Button)sender; 
    var viewType = (Type)button.Tag; 

    using (var form = (Form)Activator.CreateInstance(viewType)) 
    { 
     form.ShowDialog(this); 
    } 
} 
中保存顯示錶格的類型來擺脫lambdas

然後「訂閱」事件

apartmentDetailsButton.Tag = typeof(ApartmentDetails.View); 
apartmentDetailsButton.Click += OnButtonClick; 

apartmentDetailsButton.Tag = typeof(Reminders.View); 
remindersButton.Click += OnButtonClick;  
相關問題