我找到了以下代码,它将遍历我项目中所有已关闭的表单,并打开一个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);
}
}
答案 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);
}
答案 3 :(得分:0)
试试这个:
if (myType.BaseType.FullName == "System.Windows.Forms.Form")
{
//Application.Run((Form)myType);
Application.Run((Form)Activator.CreateInstance(myType));
}