Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何缩短MDI中各种winform调用的代码_C#_.net_Winforms - Fatal编程技术网

C# 如何缩短MDI中各种winform调用的代码

C# 如何缩短MDI中各种winform调用的代码,c#,.net,winforms,C#,.net,Winforms,我有一个mdi,其中有几行代码,如下所示。唯一的更改是正在打开的窗体对象。所以我想用单函数定义来完成所有这些工作。 当我试图捕获发送者时,它会在此处为我提供ToolStipMenuItem。但我希望它的发送者是表单名,这样我就可以打开它相应的表单 private void purchaseInvoiceToolStripMenuItem_Click(object sender, EventArgs e) { Forms.PurchaseInvoice purinv = new Digit

我有一个mdi,其中有几行代码,如下所示。唯一的更改是正在打开的窗体对象。所以我想用单函数定义来完成所有这些工作。 当我试图捕获发送者时,它会在此处为我提供ToolStipMenuItem。但我希望它的发送者是表单名,这样我就可以打开它相应的表单

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很多,我现在就来看看