向splitContainer添加许多按钮(winforms)

时间:2014-03-29 12:37:15

标签: c# winforms button splitcontainer

我正在寻找答案,但找不到任何东西,所以:

我正在制作简单的项目,我对此有疑问:

// 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(..)被取消注释时,它会绘制一切正常,它应该如何。 我的问题是如何?

1 个答案:

答案 0 :(得分:0)

这听起来像是Random的一个相当常见的问题。当你把它变成类级变量时它通常会消失:

public static Random r = new Random();

通常只需要一个Random生成器,它需要将其设置为静态。

但为什么MessageBox有帮助?

最常出现的问题是,不是保留Random的单个静态实例,而是快速连续创建新实例。这可能发生得如此之快,以至于它们从当前时间得到相同的默认种子,因此将创建相同的数字序列。

现在,显示MessageBox会在创建新Random个实例之间花费大量时间,因此问题似乎 已解决但实际上只是隐藏 ..

另一个更隐蔽的方法是隐藏这个(和其他时间相关的问题)它正在使用调试器 - 但不要让它阻止你使用它;-)