C# 初始化并调用公共窗体

C# 初始化并调用公共窗体,c#,winforms,C#,Winforms,我知道这个标题有误导性,但我想不出更好的方法来解决这个问题。我有一个程序,它显示一个表单,允许用户从其他程序中选择要运行的程序。然后我尝试创建一些通用代码来调用表单。不确定不复制代码的最佳方法。这就是我要做的 TaxYearForm loTaxYear = new TaxYearForm(); var loTaxProgram = new BaseForm(); if (loTaxYear.ShowDialog() == DialogResul

我知道这个标题有误导性,但我想不出更好的方法来解决这个问题。我有一个程序,它显示一个表单,允许用户从其他程序中选择要运行的程序。然后我尝试创建一些通用代码来调用表单。不确定不复制代码的最佳方法。这就是我要做的

        TaxYearForm loTaxYear = new TaxYearForm();

        var loTaxProgram = new BaseForm();

        if (loTaxYear.ShowDialog() == DialogResult.OK)
        {
            string lsTaxModule = loTaxYear.gsTaxModule.ToUpper();
            int lnTaxYear = loTaxYear.gnPrimaryFilter;

            switch (lsTaxModule)
            {
                case "RE":
                    RealEstateForm loTaxProgram = new RealEstateForm();

                    break;
                case "PC":
                    PerCapitaForm loTaxProgram = new PerCapitaForm();

                    break;

            }

            loTaxProgram.gsUserId = gsUserId;
            loTaxProgram.gnPrimaryFilter = lnTaxYear;
            loTaxProgram.gnSecurityLevel = gnSecurityLevel;

            loTaxProgram.ShowDialog();

我不能这样做,因为在switch语句中我重新使用了变量loTaxProgram。我可以将所有代码放在每个case语句中,但这正是我想要避免的。我在一个类中创建了一个方法,但遇到了相同的问题,因为我必须将参数声明为基形式。

无需进一步重新声明

switch (lsTaxModule)
{
  case "RE":
    loTaxProgram = new RealEstateForm();

    break;
  case "PC":
    loTaxProgram = new PerCapitaForm();

    break;
}

无需再次申报

switch (lsTaxModule)
{
  case "RE":
    loTaxProgram = new RealEstateForm();

    break;
  case "PC":
    loTaxProgram = new PerCapitaForm();

    break;
}

如果两个表单都源于基本表单,则不要重新声明
loTaxProgram
变量

        TaxYearForm loTaxYear = new TaxYearForm();

        BaseFrom loTaxProgram;

        if (loTaxYear.ShowDialog() == DialogResult.OK)
        {
            string lsTaxModule = loTaxYear.gsTaxModule.ToUpper();
            int lnTaxYear = loTaxYear.gnPrimaryFilter;

            switch (lsTaxModule)
            {
                case "RE":
                    loTaxProgram = new RealEstateForm();

                    break;
                case "PC":
                    loTaxProgram = new PerCapitaForm();

                    break;

            }

            loTaxProgram.gsUserId = gsUserId;
            loTaxProgram.gnPrimaryFilter = lnTaxYear;
            loTaxProgram.gnSecurityLevel = gnSecurityLevel;

            loTaxProgram.ShowDialog();

如果两个表单都源于基本表单,则不要重新声明
loTaxProgram
变量

        TaxYearForm loTaxYear = new TaxYearForm();

        BaseFrom loTaxProgram;

        if (loTaxYear.ShowDialog() == DialogResult.OK)
        {
            string lsTaxModule = loTaxYear.gsTaxModule.ToUpper();
            int lnTaxYear = loTaxYear.gnPrimaryFilter;

            switch (lsTaxModule)
            {
                case "RE":
                    loTaxProgram = new RealEstateForm();

                    break;
                case "PC":
                    loTaxProgram = new PerCapitaForm();

                    break;

            }

            loTaxProgram.gsUserId = gsUserId;
            loTaxProgram.gnPrimaryFilter = lnTaxYear;
            loTaxProgram.gnSecurityLevel = gnSecurityLevel;

            loTaxProgram.ShowDialog();

最快的方法是这样做(注意案例陈述中的变化):


作为将来的参考,您可能希望在谷歌上搜索工厂模式,这在我看来非常适合此类代码。

最快的方法是这样做(注意案例语句中的更改):


作为将来的参考,您可能希望在google上搜索工厂模式,这在我看来非常适合此类代码。

我建议创建一个新的工厂类来创建表单:

public class FormFactory
{
    public BaseFrom Create(string taxCode)
    {
        switch (taxCode)
        {
            case "RE":
                return new RealEstateForm();

                // rest of stuff.
        }
    }
}
因此,您的代码可以如下所示:

if (loTaxYear.ShowDialog() == DialogResult.OK)
{    
    var factory = new FormFactory();

    var loTaxProgram = factory.Create(loTaxYear.gsTaxModule.ToUpper());

    loTaxProgram.gsUserId = gsUserId;
    loTaxProgram.gnPrimaryFilter = loTaxYear.gnPrimaryFilter;
    loTaxProgram.gnSecurityLevel = gnSecurityLevel;

    loTaxProgram.ShowDialog();
}

因此,factory类有责任创建一个表单,使事情变得更干净。

我建议创建一个新的factory类来创建表单:

public class FormFactory
{
    public BaseFrom Create(string taxCode)
    {
        switch (taxCode)
        {
            case "RE":
                return new RealEstateForm();

                // rest of stuff.
        }
    }
}
因此,您的代码可以如下所示:

if (loTaxYear.ShowDialog() == DialogResult.OK)
{    
    var factory = new FormFactory();

    var loTaxProgram = factory.Create(loTaxYear.gsTaxModule.ToUpper());

    loTaxProgram.gsUserId = gsUserId;
    loTaxProgram.gnPrimaryFilter = loTaxYear.gnPrimaryFilter;
    loTaxProgram.gnSecurityLevel = gnSecurityLevel;

    loTaxProgram.ShowDialog();
}
因此,创建一个表单,让事情变得更干净,这将是工厂类的责任