代码之家  ›  专栏  ›  技术社区  ›  Shantanu Gupta

如何缩短mdi中各种winform调用的代码

  •  -1
  • Shantanu Gupta  · 技术社区  · 15 年前

    我有一个mdi,其中有几行代码,如下所示。只有chage是正在打开的窗体对象。所以我希望所有的工作都只使用单一的函数定义。 当我试图捕获发送者时,它会在这里给我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();
      }
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Hans Passant    15 年前

    您正在获取所有这些小型单击事件处理程序,因为您使用设计器创建了事件处理程序。如果你自己写事件分配,很容易摆脱它们。例如:

      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()); };
    
        2
  •  2
  •   Jon Skeet    15 年前

    这个怎么样?如果您的某些表单需要构造函数参数,则会使工作变得稍微复杂一些,但您可能会有一个非泛型重载 Func<Form> 说明如何构建要显示的窗体。

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