我有两种颜色“红色”也是“三文鱼”。我需要创建动态面板和面板背景颜色。这些颜色必须在两种颜色之间(红色
public Color x, y;
protected void Page_Load(object sender, EventArgs e)
{
BackGroundColorArranger(Color.Red, Color.Salmon);
}
void BackGroundColorArranger(Color x, Color y)
{
BackGroundColorArrangerBase(Convert.ToInt32((float)(x.ToArgb() + y.ToArgb()) / 2));
}
void BackGroundColorArrangerBase(int z)
{
Panel panel = new Panel();
panel.ID = z.ToString();
panel.Width = 150;
panel.Height = 50;
panel.BackColor = Color.FromArgb(z);
this.Controls.Add(panel);
BackGroundColorArranger(x, Color.FromArgb(z));
}
但我怎么能这样做呢。上面的代码给我stackoverflow错误。
答案 0 :(得分:4)
因为您在没有退出条件的情况下递归调用BackGroundColorArranger。这是一个提示,当您在调试器中获得堆栈溢出异常时,请转到Debug Menu - > Windows - >调用堆栈,你会立即看到问题。
答案 1 :(得分:2)
不是C#开发人员,它在我看来就像你在那里进行简单的无限递归一样。
这是一个笑话问题还是这里有什么交易?
答案 2 :(得分:0)
你得到一个堆栈溢出因为每个都相互调用(然后调用另一个,依此类推,直到堆栈溢出):
您的代码是有效的:
void BackGroundColorArranger(Color, Color)
{
BackGroundColorArrangerBase(int);
}
void BackGroundColorArrangerBase(int)
{
BackGroundColorArranger(Color, Color);
}
答案 3 :(得分:0)
你递归调用相同的函数,股票溢出错误意味着你的递归永远不会结束。
您需要更改参数,以便在方法调用自身时最终找到结束。
答案 4 :(得分:0)
正如他们所说的那样,你有一个无限的递归循环,这就是你获得Stack Overflow的原因。
快速修复从BackGroundColorArrangerBase中删除此行:
BackGroundColorArranger(x, Color.FromArgb(z));
所以它看起来像这样:
void BackGroundColorArrangerBase(int z)
{
Panel panel = new Panel();
panel.ID = z.ToString(); //this wil generate the same id for the same pair of colors
panel.Width = 150;
panel.Height = 50;
panel.BackColor = Color.FromArgb(z);
this.Controls.Add(panel);
}
应该停止递归。除了动态面板创建之外,它还不是很清楚你需要什么。因为代码只会创建一个面板,并且每次调用BackGroundColorArranger时都会创建一个新面板 - 使用不同的颜色对 - 因为您使用颜色对作为面板的ID。
如果您需要多个面板,请使用不同的颜色对调用BackGroundColorArranger的有限循环...如果您需要在屏幕上实际看到面板,则需要更改面板。位置在ArrangerBase中,每个面板都以固定大小的原点开始。