【问题标题】:Create a new form every time a button has been clicked [closed]每次单击按钮时创建一个新表单[关闭]
【发布时间】:2013-08-22 08:21:13
【问题描述】:

我想知道。 Microsoft Word、Excel 等应用程序是如何创建一个内部有空白的新表单的,就像我们创建另一个新表单一样。

我试过代码:

this.Hide();

Form2 secondaryForm = new Form2(); 
secondaryForm.ShowDialog();

this.Close();

上面的代码是创建一个新的空白表格(new form),但那只是时间有限。我想知道的是,应用程序如何在如此无限的时间内制作一千个新的空白表格(新表格)?

注意:我说的无限时间的意思是:我们可以创建一个新的表单,表单总是会被创建,无论我们点击多少次“新建”按钮

提前致谢!

【问题讨论】:

  • unlimited time 是什么意思?
  • 我的意思是,当我点击“按钮”(即创建一个新表单)时,无论我们点击多少次“按钮”,都会始终创建新表单
  • 调用 Show,而不是 ShowDialog 并且不要关闭父窗体
  • @Fuhans 使用secondaryForm.Show() 而不是ShowDialog() 并且不要关闭您的主表单
  • 你可以试试while(true)new Form2().Show();,应该做你想做的事

标签: c# winforms


【解决方案1】:

我上面的答案很好,但我想扩展它们。

您的代码不工作的原因是因为您正在关闭 主窗体

主窗体是程序启动时运行的窗体。如果您创建一个简单的 winform 并查看 main 函数,您会看到类似

     Application.EnableVisualStyles();
     Application.SetCompatibleTextRenderingDefault(false);
     Application.Run(new Form1());

当你关闭 Form1 时你会回到这里继续运行,完成 main 函数并结束程序。

除了其他人的建议之外,您可以做的是创建一个不可见的主窗体,并在创建主窗体后立即创建另一个窗体。这样您就可以随意关闭和打开表单,而不会关闭程序。

至于你所问的,能够打开几个表格。你可以这样做:

Form frm = new Form();// Creating a form
frm.Show();// displaying the form

ShowDialog 方法执行 show 所做的工作,但也会冻结打开它的表单。所以你可能不想要它

【讨论】:

  • 嗯,是的,没想到该设置是默认设置。但是有一个比你建议的更好的解决方案,就是change the ShutdownMode to AfterAllFormsClose
  • @CodyGray 天哪!谢谢!棒极了。从来没有这样的想法。哇...我只是想我可以使用它的所有时间...
  • 它是 VB.NET 应用程序“属性”页面上的内置选项。我不知道为什么它在 C# 中隐藏得这么好。
  • 感谢@NoIdeaForName
【解决方案2】:

以下代码将允许您在不关闭主表单的情况下打开任意数量的表单。

//this.Hide();

Form2 secondaryForm = new Form2(); 
secondaryForm.Show();

//this.Close();

【讨论】:

    【解决方案3】:

    很简单,他们只需创建所需表单类的新实例并调用其Show method

    MyForm frm = new MyForm();
    frm.Show();
    

    您当前正在使用 ShowDialog 方法,该方法会创建一个 modal 对话框,即阻止用户与应用程序其余部分的交互,直到用户关闭它。这不是你想要的。

    您也不需要调用HideClose 方法,除非您确实想关闭原始表单。 Office 应用程序不执行此操作——“新建”只是打开一个新窗口,保持当前窗口不变。

    如果您确实想在打开新表单时关闭原始表单,请这样做:

    // Create and display new form
    MyForm frm = new MyForm();
    frm.Show();
    
    // Close this form
    this.Close();
    

    【讨论】:

      【解决方案4】:

      我猜你想produce 表单一旦我们点击按钮,表单应该被生成并显示出来不管表单数量的限制。为此,您可以使用Timer

      //Place this code in your main form constructor
      Timer t = new Timer {Interval = 100};    
      t.Tick += (s,e) => {
         new Form2().ShowDialog();
      };
      button1.Click += (s,e) => {
         t.Start();
      };
      //NOTE: you have to use the stop button of the IDE to stop this,
      //it will run continuously producing new forms and showing them 
      //without allowing you to touch the Close button of your main form.
      

      您应该限制表单的数量,因为我们无法生成尽可能多的表单,我已经测试过,System.dll 中抛出了一个StackOverflowException,打开了 272 个表单:)))。尝试添加一个count 变量并在计时器达到一个数字(例如 272)时停止计时器)

      【讨论】:

        猜你喜欢
        • 2014-01-26
        • 2018-10-29
        • 1970-01-01
        • 1970-01-01
        • 2013-05-24
        • 1970-01-01
        • 2013-02-14
        • 2021-08-16
        • 1970-01-01
        相关资源
        最近更新 更多