C# 如何缩短MDI中各种winform调用的代码
我有一个mdi,其中有几行代码,如下所示。唯一的更改是正在打开的窗体对象。所以我想用单函数定义来完成所有这些工作。 当我试图捕获发送者时,它会在此处为我提供ToolStipMenuItem。但我希望它的发送者是表单名,这样我就可以打开它相应的表单C# 如何缩短MDI中各种winform调用的代码,c#,.net,winforms,C#,.net,Winforms,我有一个mdi,其中有几行代码,如下所示。唯一的更改是正在打开的窗体对象。所以我想用单函数定义来完成所有这些工作。 当我试图捕获发送者时,它会在此处为我提供ToolStipMenuItem。但我希望它的发送者是表单名,这样我就可以打开它相应的表单 private void purchaseInvoiceToolStripMenuItem_Click(object sender, EventArgs e) { Forms.PurchaseInvoice purinv = new Digit
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();
}
}
这个怎么样?如果你的一些表单需要构造函数参数,这会让生活变得有点棘手,但是你可能会有一个非泛型重载,使用Func来说明如何构建要显示的表单
private static void AssociateBuilder<T>(ToolStripMenuItem item)
where T : Form, new()
{
item.Click += () => new T().Show();
}
AssociateBuilder<PurchaseInvoice>(purchaseInvoiceToolsStripMenuItem);
AssociateBuilder<Ledger>(ledgerGroupsToolStripMenuItem);
// etc
由于使用了设计器来创建事件处理程序,因此获得了所有这些小的单击事件处理程序。如果您自己编写事件分配,则很容易摆脱它们。例如:
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();
}
}
如果您仍然使用C2.0,则可以使用匿名方法:
purchaseInvoiceToolStripMenuItem.Click += delegate { createChild(new frmPurchaseInvoice()); };
@汉斯:o,e=>createchildnewfrmpurchaseinvice;这句话是什么意思。请详细说明这是一个lambda表达式。如果您仍然使用C2.0,那么可以使用匿名方法。帖子更新了一个例子。@Jon:请注意使用where T:Form,new,我对你所说的一切一无所知wrote@Shantanu试着寻找c泛型。@达米安:我是泛型新手,不过,我只想知道形式、新语法是泛型的一部分还是有一些意义。我对这个概念略知一二generics@Shantanu:这些是泛型类型参数T的类型约束。不过,在注释中要解释的内容有点多-我建议您在C语言书中查找它。Thx很多,我现在就来看看