2

我发现以下代码将遍历我项目中所有关闭的表单并打开一个 MessageBox 并显示表单名称。

但是,我将如何修改它而不是显示 MessageBox;它实际上会一个一个地打开每个封闭的表格吗?我更喜欢使用 ShowDialog 或类似的东西,所以每个表单一次只能打开 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

4 回答 4

3

尝试这个:

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

您可以将它与像这样的默认构造函数或带参数的构造函数一起使用,但这有点棘手。
更多信息请参见:Activator.CreateInstance 方法

于 2013-03-25T19:18:21.140 回答
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();
       }   

}  
于 2013-03-25T19:28:56.323 回答
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,按表单名称获取表单实例

于 2013-03-25T19:14:09.337 回答
0

尝试这个:

  if (myType.BaseType.FullName == "System.Windows.Forms.Form")
   {
       //Application.Run((Form)myType);
       Application.Run((Form)Activator.CreateInstance(myType));
   }  
于 2013-03-25T19:16:10.753 回答