我有树视图,每个节点标签包含表单名称,当我点击节点我打开表单 我的代码如下
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的形式,对于每个表单我必须正确的代码。 是否有可能,如果我通过表单打开它就像单个案例一样打开?
答案 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();
通过这种方式,您可以在一个集中点上添加要在执行特定表单时执行的特定操作,并保留已写入的所有功能。
当然,您需要使用单独的方法重构开关案例。
如果您的表单有不同的操作(个案)而不是始终相同的重复代码序列,则此方法很有趣。