2010-04-24 55 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