2

プロジェクト内のすべての閉じたフォームをループし、メッセージボックスを開いてフォーム名を表示する次のコードを見つけました。

ただし、MessageBoxを表示する代わりに、どのように変更すればよいでしょうか。代わりに、実際には閉じた各フォームを1つずつ開きますか?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

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 に答える