一次打开一个项目中所有已关闭的表单

时间:2013-03-25 19:10:49

标签: c# winforms forms

我找到了以下代码,它将遍历我项目中所有已关闭的表单,并打开一个MessageBox并显示表单名称。

但是,如何修改它而不是显示MessageBox;它实际上会逐个打开每个封闭的表格吗?我更喜欢使用ShowDialog或类似的东西,所以每个表单一次只打开1个,而不是一次打开。如果我关闭1个表单,那么下一个表单将会打开,等等。这将是很好的。

//http://kellyschronicles.wordpress.com/2011/08/06/show-all-forms-in-a-project-with-c/
System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetEntryAssembly();
Type[] Types = myAssembly.GetTypes();
foreach (Type myType in Types)
{
   if (myType.BaseType == null) continue;

       if (myType.BaseType.FullName == "System.Windows.Forms.Form")
       {
           //Application.Run(myType.Name());  //This does not work
           MessageBox.Show(myType.Name);
       }   

}  

4 个答案:

答案 0 :(得分:3)

试试这个:

var form = (Form)Activator.CreateInstance(myType);
form.ShowDialog();

你可以使用像这样的默认构造函数或带参数的构造函数,但这有点棘手 有关详情,请参阅:Activator.CreateInstance Method

答案 1 :(得分:1)

System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetEntryAssembly();
Type[] Types = myAssembly.GetTypes();
foreach (Type myType in Types)
{
   if (myType.BaseType == null) continue;

       if (myType.BaseType.FullName == "System.Windows.Forms.Form")
       {
           //Application.Run(myType.Name());  //This does not work
           //MessageBox.Show(myType.Name);
           var myForm = (System.Windows.Forms.Form)
                  Activator.CreateInstance(myAssembly.Name, myType.Name);
           myForm.Show();
       }   

}  

答案 2 :(得分:0)

您需要为Application.Run方法提供表单的新实例。 尝试将其强制转换为表单并创建新实例。 像这样:

public Form TryGetFormByName(string frmname)
{
   var formType = Assembly.GetExecutingAssembly().GetTypes().Where(a => a.BaseType == typeof(Form) && a.Name == frmname).FirstOrDefault();
   if (formType == null) // If there is no form with the given frmname
       return null;
   return (Form)Activator.CreateInstance(formType);
}

来自这篇文章Winforms, get form instance by form name

答案 3 :(得分:0)

试试这个:

  if (myType.BaseType.FullName == "System.Windows.Forms.Form")
   {
       //Application.Run((Form)myType);
       Application.Run((Form)Activator.CreateInstance(myType));
   }