【发布时间】:2020-10-28 12:48:39
【问题描述】:
我必须在 C# windows 窗体中用面板做一个棋盘。我有一个按钮、两个文本框(用于设置列数和行数)和一个大面板,我将在其中放置小面板。
这是按钮点击事件:
private void button1_Click(object sender, EventArgs e)
{
int x, y, width, height, colors=0;
Panel paneln;
rows = Convert.ToInt32(textBox1.Text);
columns = Convert.ToInt32(textBox2.Text);
height = panel1.Size.Height / rows;
width = panel1.Size.Width / columns;
x = panel1.Location.X;
y = panel1.Location.Y;
for (int i=0;i<rows;i++)
{
for(int k = 0;k<columns;k++)
{
paneln = new Panel();
paneln.Location = new Point(x, y);
paneln.Size = new Size(width, height);
if (colors % 2 == 0)
paneln.BackColor = Color.Black;
else
paneln.BackColor = Color.White;
paneln.BringToFront();
panel1.SendToBack();
this.Controls.Add(paneln);
x += width;
colors++;
}
x= panel1.Location.X;
y += height;
if (columns % 2 == 0) colors++;
}
button1.Enabled = false;
}
它工作正常,但如果列值是偶数,则不显示最后一个面板(右下角)。
例如,对于 rows=4 和 columns=4 我得到这个:
黑白无常
W B W B
黑白无常
W B W
我试图强制内部 for 在最后一行再执行一个循环,但随后它放置了两个面板,这实际上是有道理的,并且让我认为它实际上创建了面板对象,但不知何故它没有显示。
有什么建议吗?谢谢!
【问题讨论】:
-
您缺少:this.Controls.Add(paneln) 将面板添加到表单中。
-
使用“绘图”控件是一种疯狂的开销,完全没有必要。只需使用父面板的
Paint事件并通过Graphics.FillRectangle绘制棋盘即可。每当您需要重新绘制棋盘时(例如发生移动时),请致电panel.Invalidate。 -
@jdweng 我怎么会错过最后一个?当 i=3 和 k=3 时循环执行
-
@GyörgyKőszeg 这是我们老师说的,这是第一个Windows Form作业,我必须这样做:(
-
面板不够大。您是否想将新面板添加到表单或 Panel1 中?您正在向其中添加新面板,我不确定是 Form 还是 Panel1。问题是 x 和 y 的起始值。面板 1 的位置不应该被使用。