2012-08-10 37 views
0

我知道標題有誤導性,但我無法想象這個問題會更好。我有一個程序顯示一個表單,允許用戶從其他程序中選擇運行。然後我試圖創建一些通用代碼來調用表單。不確定沒有重複代碼的最佳方法。這是我想要做的;初始化並調用常用表格

 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語句中,但這是我想要避免的。我在類中創建了一個方法,但是由於我不得不聲明參數爲BaseForm,所以出現了同樣的問題。

回答

2

我建議建立一個新的工廠類來創建窗體:

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(); 
} 

所以這將是工廠類的責任創造一個形式,使事情變得更加清潔。

1

有進一步重新申報

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

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

    break; 
} 
1

無需如果同時你的形式從您的基本形式獲得,然後再次聲明不要你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(); 
+0

就是這樣。謝謝。 – ggrewe1959 2012-08-10 13:28:21

1

最快的方法是做這個(注意case語句的變化):

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": 
       loTaxProgram = new RealEstateForm(); 

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

       break; 

     } 

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

     loTaxProgram.ShowDialog(); 

以供將來參考,您可能希望谷歌這將適應這種工廠模式代碼相當漂亮IMO。

+0

就是這樣。謝謝! – ggrewe1959 2012-08-10 13:29:09