打开新的winform

时间:2013-03-26 10:51:55

标签: c#

我有树视图,每个节点标签包含表单名称,当我点击节点我打开表单 我的代码如下

  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的形式,对于每个表单我必须正确的代码。 是否有可能,如果我通过表单打开它就像单个案例一样打开?

5 个答案:

答案 0 :(得分: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();
  }
}

答案 1 :(得分:2)

为什么不在Node的标签中添加对表单的引用,然后直接使用

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

答案 2 :(得分:0)

你应该能够将表单添加到节点,节点应该有一个字段,标签我认为它是object类型。在那里添加表单然后从标记中提取它。这样你就不必使用case语句,而是使用一个适用于所有表单的单个语句。

答案 3 :(得分:0)

您可以使用Activator.CreateInstance方法,而不是为每个表单使用switch case。

请参阅此MSDN Article

您可以在标记中存储完全限定名称,并使用它来实例化相应的表单。

答案 4 :(得分: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();

通过这种方式,您可以在一个集中点上添加要在执行特定表单时执行的特定操作,并保留已写入的所有功能。
当然,您需要使用单独的方法重构开关案例。

如果您的表单有不同的操作(个案)而不是始终相同的重复代码序列,则此方法很有趣。