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 として宣言する必要があったため、同じ問題がありました。

4

4 に答える 4

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

したがって、フォームを作成するのはファクトリ クラスの責任であり、物事を少しきれいにします。

于 2012-08-10T13:28:31.180 に答える
1

これ以上の再宣言は必要ありません

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

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

    break;
}
于 2012-08-10T13:22:32.050 に答える
1

両方のフォームが BaseForm から派生している場合は、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();
于 2012-08-10T13:22:45.093 に答える
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 のファクトリ パターンをググってみることをお勧めします。

于 2012-08-10T13:23:26.420 に答える