如何一次打开多个表单

时间:2017-03-15 23:09:20

标签: c# winforms

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

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();
    });

目前,这可以通过打开一个表单,用户点击该表单,然后打开一个新表单。我如何一次打开十张表格?

3 个答案:

答案 0 :(得分:1)

您的代码存在一些问题:

  1. 主要问题是ShowDialog()方法会阻塞,直到显示的表单关闭。
  2. 与第一个问题相关的是您的程序没有消息循环。通常在Application.Run()方法结束时调用Program.Main(),在默认的Winforms模板中提供此功能。在您的示例中,ShowDialog()方法提供了此循环,但当然使用它还有其他问题(请参阅第一期:) :)。
  3. 每次获得新的随机数之前,都会创建一个新的Random对象。这不仅会使Random提供的关于随机数均匀分布的保证无效,您通常可以反复使用完全相同的数字,因为代码可以执行得如此之快以至于{{{ 1}}类不会改变(它基于当前的滴答计数)。
  4. 这是一个实际有效的例子:

    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(); }); } } 方法几乎与默认Winforms模板提供的方法相同。我建议始终从此模板开始,并对其进行最小的更改。
    • 默认模板创建表单实例并将其传递给Main()。但是这种方法使得形式成为“主要形式”,当该形式关闭时,整个程序退出。在上面的示例中,只有在打开的表单的所有关闭时,程序才会退出。它通过不将任何表单实例传递给Application.Run()(将应用程序退出的控制权交到您手中),然后保留一个跟踪打开多少表单的计数器来实现此目的。当计数器返回到零时,将调用Application.Run(),这会导致Application.ExitThread()方法返回,从而允许程序退出。
    • 我通过简单地将Application.Run()对象的初始化移出表单创建循环,仅执行一次,并为所需的每个随机数重用相同的对象来解决随机数问题。
    • 我不知道Random方法的意义是什么(似乎没有在普通的RepeatAction()循环上添加任何有用的东西),但我把它放在那里与原始代码保持一致。

答案 1 :(得分:0)

尝试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();

    });

答案 2 :(得分:0)

来自MSDN

  

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

除非您想为每个表单生成不同的线程,否则应使用Control.Show()