将许多按钮添加到 splitContainer (winforms)
Posted
技术标签:
【中文标题】将许多按钮添加到 splitContainer (winforms)【英文标题】:Adding many buttons to a splitContainer (winforms) 【发布时间】:2014-05-08 23:56:35 【问题描述】:我正在寻找答案,但找不到任何东西,所以:
我正在做一个简单的项目,但我有一个问题:
// 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(..) 未注释时,它绘制的一切都很好,它应该是怎样的。 我的问题是怎么做?
【问题讨论】:
使用调试器,卢克! 听起来是 Random 的问题。当你改为public static Random r
时它会消失吗?
是的,你是对的,谢谢。使字段随机静态解决了我的问题。但是我仍然不知道为什么显示消息会干扰这个过程
当您连续快速创建新实例而不是保留 Random 的单个静态实例时,最常出现问题。这可能发生得如此之快,以至于它们获得相同的默认种子,从当前时间派生,因此将创建相同的数字序列。 MessageBox 让很多时间过去了,所以问题似乎解决了,但实际上只是隐藏了..通常只需要一个 Random 生成器,这需要将其设为静态。另一种隐藏它的方法是使用调试器;-)
@TaW 将您的评论变成答案——它应该被接受。
【参考方案1】:
这听起来像是Random
的一个相当普遍的问题。当您将其设为类级别变量时,它通常会消失:
public static Random r = new Random();
通常只需要一个Random
生成器,这需要使其成为静态的。
但是为什么MessageBox
有帮助呢?
当您连续快速创建新实例而不是保留Random
的单个静态实例时,最常出现问题。这可能发生得如此之快,以至于它们获得相同的默认种子,从当前时间派生,因此将创建相同的数字序列。
现在,显示MessageBox
让在创建新的Random
实例之间有很多时间过去,所以问题似乎已经解决了,但实际上只是隐藏..
隐藏这个(和其他时间相关问题)的另一种更狡猾的方法是使用调试器 - 但不要让它阻止你使用它;-)
【讨论】:
以上是关于将许多按钮添加到 splitContainer (winforms)的主要内容,如果未能解决你的问题,请参考以下文章
c#中关于splitContainer控件的用法:如何做到不清除控件就能在panel2中打开一个窗体呢?