C# 如何一次打开多个表单

C# 如何一次打开多个表单,c#,winforms,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 rand

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

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();
    });
publicstaticvoidrepeataction(int repeatCount,Action-Action)
{
对于(int i=0;i{
随机=新随机();
int x=随机。下一个(0,100);
Random random1=新的Random();
int y=random.Next(01100);
变量形式=新形式1
{
StartPosition=FormStartPosition.Manual,
ShowInTaskbar=false,
位置=新点(x,y)
};
form.ShowDialog();
});
目前,这是通过打开一个表单来实现的,用户单击该表单,然后打开一个新表单。如何使十个表单同时打开?

试试form.Show()

publicstaticvoidrepeataction(int repeatCount,Action-Action)
{
对于(int i=0;i
{
随机=新随机();
int x=随机。下一个(0,100);
Random random1=新的Random();
int y=random.Next(01100);
变量形式=新形式1
{
StartPosition=FormStartPosition.Manual,
ShowInTaskbar=false,
位置=新点(x,y)
};
form.Show();
});
来自:

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


除非您想为每个表单生成不同的线程,否则您应该使用

您的代码有几个问题:

  • 主要问题是
    ShowDialog()
  • 与第一个问题相关的是,您的程序没有消息泵送循环。这通常在默认的Winforms模板中通过调用
    Application.Run()
    program.Main()
    方法的末尾提供。在您的示例中,
    ShowDialog()
    方法提供了这个循环,但使用它当然还有其他问题(请参阅第一期:)
  • 每次获得新的随机数之前,您都会创建一个新的
    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();
            });
        }
    }
    
    静态类程序
    {
    /// 
    ///应用程序的主要入口点。
    /// 
    [状态线程]
    静态void Main()
    {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    ShowForms();
    Application.Run();
    }
    公共静态void RepeatAction(int repeatCount,Action Action)
    {
    对于(int i=0;i
    {
    formCount++;
    int x=随机。下一个(0,100);
    int y=random.Next(01100);
    Form1 form=新Form1
    {
    StartPosition=FormStartPosition.Manual,
    ShowInTaskbar=false,
    位置=新点(x,y)
    };
    form.FormClosed+=(发件人,e)=>
    {
    如果(--formCount>0)
    {
    返回;
    }
    Application.ExitThread();
    };
    form.Show();
    });
    }
    }
    
    注:

    • 您可能会注意到
      Main()
      方法与默认Winforms模板提供的方法几乎相同。我建议始终从该模板开始,并对其进行最小的更改
    • 默认模板创建一个表单实例并将其传递给
      Application.Run()
      。但这种方法使该表单成为“主表单”,当该窗体关闭时,整个程序将退出。在上面的示例中,该程序将仅在所有打开的窗体关闭时退出。它通过不将任何窗体实例传递给
      Application.Run()
      (这将应用程序退出的控制权交给了您),然后保留一个跟踪打开的窗体数量的计数器。当计数器返回到零时,将调用
      Application.ExitThread()
      ,这将导致
      Application.Run()
      方法返回,从而允许程序退出
    • 我通过简单地将
      random
      对象的初始化移出表单创建循环来解决随机数问题,只做一次,并为每个所需的随机数重用相同的对象
    • 我不知道
      RepeatAction()
      方法的要点是什么(除了普通的
      for
      循环之外,似乎没有添加任何有用的内容),但为了与原始代码保持一致,我把它放在了那里

    您确定表单位置不完全相同吗?它们不完全相同。它们是通过随机数位置随机生成的。听到这个消息很高兴@RohanPas@RohanPas,如果这解决了您的问题,您应该将其标记为正确答案。我不认为这可能解决问题。没有消息泵。每个表单ght出现,但它无法更新自身或与用户交互。@PeterDuniho您知道如何使其更新或交互吗?@RohanPas:是的,我知道。请参阅,谢谢。需要重复操作。
    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();
            });
        }
    }