4

各ノードタグにフォーム名が含まれるツリービューがあり、ノードをクリックするとフォームが開きます私のコードは次のとおりです

  private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            NodeClick(Convert.ToString(e.Node.Tag));
        }

    public void NodeClick(string formName)
    {
       switch (formName)
        {

            case "frmPartMaster":
                frmPartMaster partMaster = null;
                if ((partMaster =   
                   (frmPartMaster)Globale.IsFormAlreadyOpen(typeof(frmPartMaster)))  
                        == null)
                {
                    partMaster = new frmPartMaster();
                    partMaster.Show(this);

                }
                else
                {
                    partMaster.Activate();
                    partMaster.WindowState = FormWindowState.Normal;
                    partMaster.BringToFront();
                }
                break;
        }
    }

このコードは正常に動作していますが、1000 の form があります。それぞれのフォームについて、コードの大文字と小文字を区別する必要があります。単一のケースのようにフォームを開いて開くことは可能ですか?

4

5 に答える 5

2

Activator.CreateInstance の呼び出しにより、フォーム クラスのインスタンスを作成できます。

public void OpenOrActivateForm(string formType)
{
  var formType = Type.GetType(formType);
  var form = Globale.IsFormAlreadyOpen(formType);

  if(form == null)
  {
    form = Activator.CreateInstance(formType);
    from.Show(this);
  }
  else
  {
    form.Activate();
    form.WindowState = FormWindowState.Normal;
    form.BringToFront();
  }
}
于 2013-03-26T10:59:16.630 に答える
2

ノードのタグにフォームへの参照を入れて、それを直接使用してみませんか?

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            NodeClick(e.Node.Tag as Form);
        }

public void NodeClick(Form theForm)
{
   if(theForm == null) return;

   if(theForm.Visible == false)
   {
        theForm .Show(this);
   }

   theForm .Activate();
   theForm .WindowState = FormWindowState.Normal;
   theForm .BringToFront();
}
于 2013-04-22T08:43:39.617 に答える
0

フォームをノードに追加できるはずです。ノードにはフィールドが必要です。タグはオブジェクト型だと思います。そこにフォームを追加し、タグから抽出します。そうすれば、case ステートメントを使用する必要はありませんが、すべてのフォームで機能する 1 つのステートメントを使用する必要があります。

于 2013-03-26T10:56:21.643 に答える
0

すべてのフォームで switch case を使用する代わりに、メソッドを使用できますActivator.CreateInstance

このMSDN 記事を参照してください。

完全修飾名をタグに格納し、それを使用して適切なフォームをインスタンス化できます。

于 2013-03-26T10:57:49.050 に答える
0

このアプローチを使用できます。

このような文字列とアクションのディクショナリを定義します

Dictionary<string, Action> dic = new Dictionary<string,Action>();
dic.Add("frmPartMaster", OpenPartMaster);
.....

適切なアクションを追加します

private void OpenPartMaster()
{
   frmPartMaster partMaster = null;
   if ((partMaster =   
               (frmPartMaster)Globale.IsFormAlreadyOpen(typeof(frmPartMaster)))  
                    == null)
   {
                partMaster = new frmPartMaster();
                partMaster.Show(this);

   }
   else
   {
                partMaster.Activate();
                partMaster.WindowState = FormWindowState.Normal;
                partMaster.BringToFront();
   }
}

無限スイッチの代わりにそのフォームを呼び出す必要がある場合は、

dic[formName].Invoke();

このようにして、特定のフォームが要求されたときに実行する特定のアクションを追加する集中ポイントがあり、すべての機能を既に作成したままにします。
もちろん、スイッチケースを別の方法でリファクタリングする必要があります。

このアプローチは、フォームにさまざまなアクション (ケース) があり、繰り返しコードのシーケンスが常に同じであるとは限らない場合に興味深いものです。

于 2013-03-26T11:01:21.903 に答える