2014-03-29 18 views
1

我正在尋找的答案,但找不到任何東西,所以:添加許多按鈕到SplitContainer中(的WinForms)

我做簡單的項目,我有這樣一個問題:

// fragment of code in parent form 
Random r = new Random(); 
private void BeginGame() 
    { 
     SetName(); 
     sheep = new Sheep[howManySheep]; 
     for (int i = 0; i < howManySheep; i++) 
      sheep[i] = new Sheep(this); 
     (...) 
    } 

public Sheep DrawSheep 
    { 
     set 
     { 
      splitContainer1.Panel2.Controls.Add(value); 
     } 
    } 
// fragment of code in child form 
class Sheep : Button 
public Sheep(Form1 _parent) 
     : base() 
    { 
     var p = new Point(r.Next(_parent.PanelSize[0]), r.Next(_parent.PanelSize[1])); 
     Text = null; 
     Size = new Size(size, size); 
     BackColor = Color.White; 
     Tag = nrSheep++; 
     Location = p; 
     _parent.DrawSheep = this; 
     MessageBox.Show(this.Location.ToString()); 
    } 

雖然MessageBox.Show(..)被評論,但它只繪製了一隻綿羊(我的意思是所有這些,但在同一個地方) 當MessageBox.Show(..)被取消註釋時,它將一切都很好,它應該如何。 我的問題是如何?

+0

使用調試器,盧克! –

+1

聽起來像隨機問題。當它使用'public static Random r'時,它會消失嗎? – TaW

+0

是的,你說得對,謝謝。使場隨機靜態解決了我的問題。但我仍然不知道爲什麼顯示消息干擾到這個過程 – Marcin

回答

0

這聽起來像是一個相當普遍的問題Random。它通常會消失,當你把它一類級別的變量:

public static Random r = new Random(); 

通常,一個只需要一個單一的Random發生器,這就要求使其靜態的。

但爲什麼MessageBox有幫助?

這個問題最常發生的原因是,如果不是保持一個Random的單個靜態實例,而是快速連續創建新實例。這可以發生得如此之快,以至於它們從當前時間獲得相同的默認種子,因此會創建相同的數字序列。現在

,呈現出MessageBox讓很多創造新Random實例之間的時間通的,所以這個問題似乎解決但真的只是隱藏 ..

另外一個更隱瞞這種(和其他時間相關的問題)它更使用調試器 - 但不要讓它阻止你使用它;-)