Как я могу сократить свой код для различных вызовов winform в MDI - PullRequest
0 голосов
/ 24 апреля 2010

У меня есть MDI, где у меня есть несколько строк кода, как показано ниже. Только chage - это объект Form, который открывается. Поэтому я хочу, чтобы вся эта работа использовалась только для определения одной функции. Когда я пытаюсь захватить отправителя, он дает мне 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 ]

2 голосов
/ 24 апреля 2010

Как насчет этого? Если некоторые из ваших форм нуждаются в аргументах конструктора, это немного усложнит жизнь, но вы могли бы иметь неуниверсальную перегрузку, принимающую 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
1 голос
/ 24 апреля 2010

Вы получаете все эти небольшие обработчики событий 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()); };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...