2017-03-15 112 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()