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();
}
因此,创建一个表单,让事情变得更干净,这将是工厂类的责任