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 个表格,对于每个表格,我必须正确区分代码。如果我通过它打开它的表格,是否有可能像在单一情况下一样打开它?

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

您可以使用这种方法:

像这样定义字符串和动作的字典

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

通过这种方式,您有一个集中点,您可以在请求特定表单时添加要执行的特定操作,并保留所有已编写的功能。
当然,您需要在不同的方法中重构 switch case。

如果您的表单有不同的操作(案例)而不是总是相同的重复代码序列,那么这种方法很有趣。

于 2013-03-26T11:01:21.903 回答
0

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

于 2013-03-26T10:56:21.643 回答
0

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

请参阅此MSDN 文章

您可以在标签中存储完全限定名称并使用它来实例化适当的表单。

于 2013-03-26T10:57:49.050 回答