2017-03-15 88 views
2

如何在不显示下一个表单之前让用户退出每个表单一次生成多个表单?如何一次打开多个表单

public static void RepeatAction(int repeatCount, Action action) 
{ 
    for (int i = 0; i < repeatCount; i++) 
     action(); 
} 

static void Main(string[] args) 
{ 
    RepeatAction(10,() => { 
     Random random = new Random(); 
     int x = random.Next(0, 100); 
     Random random1 = new Random(); 
     int y = random.Next(0, 100); 

     var form = new Form1 
     { 
      StartPosition = FormStartPosition.Manual, 
      ShowInTaskbar = false, 
      Location = new Point(x, y) 
     }; 
     form.ShowDialog(); 
    }); 

目前这部作品通过打开一个表格,用户点击这张表格中,然后打开一个新的。我怎样才能让十个表单一次打开?

+0

您确定窗体位置不完全相同吗? – JohanP

+0

他们不完全一样。它们是通过随机数字位置随机产生的。 –

回答

1

有几个问题与您的代码:

  1. 的主要问题是,ShowDialog()方法一直阻塞所显示的表单已关闭。
  2. 与第一个问题相关的是,你的程序没有消息循环。这通常是在默认的Winforms模板中通过调用在Program.Main()方法末尾提供的。在你的例子中,ShowDialog()方法提供了这个循环,但是当然使用它有其他问题(参见第一个问题:))。
  3. 在每次获得新的随机数之前,您都会创建一个新的Random对象。这不仅会使得无论Random给予你什么关于随机数的均匀分布的保证失效,还会经常反复使用完全相同的数字,因为代码可以执行得太快以至于Random类的默认种子不会改变(它基于当前的滴答计数)。

下面是实际工作的例子:

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     ShowForms(); 
     Application.Run(); 
    } 

    public static void RepeatAction(int repeatCount, Action action) 
    { 
     for (int i = 0; i < repeatCount; i++) 
      action(); 
    } 

    static void ShowForms() 
    { 
     Random random = new Random(); 
     int formCount = 0; 

     RepeatAction(10,() => 
     { 
      formCount++; 

      int x = random.Next(0, 100); 
      int y = random.Next(0, 100); 

      Form1 form = new Form1 
      { 
       StartPosition = FormStartPosition.Manual, 
       ShowInTaskbar = false, 
       Location = new Point(x, y) 
      }; 

      form.FormClosed += (sender, e) => 
      { 
       if (--formCount > 0) 
       { 
        return; 
       } 

       Application.ExitThread(); 
      }; 

      form.Show(); 
     }); 
    } 
} 

注:

  • 您可能会注意到Main()方法几乎是相同的东西默认的WinForms模板提供。我推荐总是从此模板开始,并对其进行微小更改。
  • 默认模板创建一个表单实例并将其传递给Application.Run()。但是这种方法使得这种形式成为“主要形式”,当这种形式结束时,整个计划就会退出。在上面的例子中,只有在打开的表格的全部关闭时,程序才会退出。它通过不传递任何表单实例到Application.Run()(将应用程序退出控制在您的手中),然后保持一个跟踪打开多少表单的计数器来实现。当计数器回到零时,调用Application.ExitThread(),这会导致Application.Run()方法返回,从而允许程序退出。
  • 我通过简单地将Random对象的初始化移出窗体创建循环,只做一次,并为每个所需的随机数重复使用相同的对象来解决随机数问题。
  • 我不知道RepeatAction()方法的要点是什么(似乎没有在简单的香草for循环上添加任何有用的东西),但是为了与原始代码保持一致,我将它留在那里。
+0

谢谢。重复行动是需要的。 –

0

Try form.Show();

public static void RepeatAction(int repeatCount, Action action) 
{ 
    for (int i = 0; i < repeatCount; i++) 
     action(); 
} 
static void Main(string[] args) 
{ 
    RepeatAction(10,() => 
    { 
     Random random = new Random(); 
     int x = random.Next(0, 100); 
     Random random1 = new Random(); 
     int y = random.Next(0, 100); 

     var form = new Form1 
     { 
      StartPosition = FormStartPosition.Manual, 
      ShowInTaskbar = false, 
      Location = new Point(x, y) 
     }; 
     form.Show(); 

    }); 
+0

工程!谢啦! –

+0

很高兴听到@RohanPas –

+0

@RohanPas,如果这解决了您的问题,您应该将其标记为正确的答案。 –

0

MSDN

您可以使用ShowDialog()在应用程序中显示一个模式对话框。当调用此方法时,直到关闭对话框之后,它后面的代码才会执行​​。

除非你想产卵每种形式不同的线程,你应该使用Control.Show()

相关问题