2010-04-24 66 views
-1

我有一個mdi,其中有幾行代碼,如下所示。只有chage是正在打開的Form對象。所以我希望所有這些工作只使用單一的函數定義。 當我嘗試捕獲發件人時,它會在此處爲我提供ToolStipMenuItem。但我希望它的發件人是表單名稱,以便我可以打開其相應的表單。我如何縮短MDI中各種winform調用的代碼

private void purchaseInvoiceToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    Forms.PurchaseInvoice purinv = new DigitalInvy.Forms.PurchaseInvoice(); 
    purinv.Show(); 
} 

private void lederGroupsToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    Forms.LedgerGroup lgrp = new DigitalInvy.Forms.LedgerGroup(); 
    lgrp.Show(); 
} 

private void voucherEntryToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    Forms.VoucherEntry ventry = new DigitalInvy.Forms.VoucherEntry(); 
    ventry.Show(); 
} 

private void currencyToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    Forms.CurrencyMaster currency = new DigitalInvy.Forms.CurrencyMaster(); 
    currency.Show(); 
} 

private void countryToolStripMenuItem_Click(object sender, EventArgs e) 
{ 

    Forms.CountryMaster country = new DigitalInvy.Forms.CountryMaster(); 
    country.Show(); 
} 

我想要做這樣的事情

private void cMenuItem_Click(object sender, EventArgs e) 
{ 
if(sender.GetType()==Form) 
    { 
    Forms.CountryMaster country = new DigitalInvy.Forms.CountryMaster(); 
    country.Show(); 
    } 
} 

回答

1

,因爲您使用設計器創建事件處理程序你得到所有這些小Click事件處理程序。如果您自己編寫事件分配,則很容易擺脫它們。例如:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     purchaseInvoiceToolStripMenuItem.Click += (o,e) => createChild(new frmPurchaseInvoice()); 
     ledgerGroupToolStripMenuItem.Click += (o, e) => createChild(new frmLedgerGroup()); 
     // etc.. 
    } 
    private void createChild(Form frm) { 
     frm.MdiParent = this; 
     frm.Show(); 
    } 
    } 

如果你仍然在C#2.0,那麼你可以使用匿名方法:

purchaseInvoiceToolStripMenuItem.Click += delegate { createChild(new frmPurchaseInvoice()); }; 
+0

@Hans:(o,e)=> createChild(new frmPurchaseInvoice());這條線是什麼意思。請詳細說明 – 2010-04-24 09:06:22

+0

這是一個lambda表達式。如果您仍然使用C#2.0,那麼您可以使用匿名方法。帖子更新了一個例子。 – 2010-04-24 09:16:21

2

這個怎麼樣?如果你的某些表單需要構造函數參數,它會使生活稍微有點棘手,但是你可以通過一個非泛型超載來說明如何構建要顯示的表單。

private static void AssociateBuilder<T>(ToolStripMenuItem item) 
    where T : Form, new() 
{ 
    item.Click +=() => new T().Show(); 
} 

AssociateBuilder<PurchaseInvoice>(purchaseInvoiceToolsStripMenuItem); 
AssociateBuilder<Ledger>(ledgerGroupsToolStripMenuItem); 
// etc 
+0

@喬恩:請把一些火炬使用「其中T:形式,新的() 「我不知道你寫的所有內容 – 2010-04-24 09:17:53

+0

@Shantanu Trygoogling for」c#generics「。 – 2010-04-24 09:35:22

+0

@Damian:我對泛型很陌生,但我只是想知道「Form,new()」語法是泛型的一部分,還是有一定意義的。我知道關於泛型的一點概念 – 2010-04-24 09:40:32