在我的程序中生成按钮之前,应该使用以下方法清除它们:
for (int i = 0; i < buttons.Length; i++)
this.Controls.Remove(buttons[i]);
然而,上一代的所有按钮仍然存在。可能导致这种情况的原因是什么?
(下面是整个函数,numButton在其他函数中发生了变化。)
int numButtons = 5;
Button[] buttons = new Button[10];
private void generate_buttons()
{
for (int i = 0; i < buttons.Length; i++)
{
this.Controls.Remove(buttons[i]);
}
for (int i = 0; i < numButtons; i++)
{
buttons[i] = new Button();
buttons[i].Name = "btn" + i.ToString();
buttons[i].Text = Convert.ToString(i + 1);
buttons[i].Size = new Size(40, 24);
int yOffset = 40;
int xOffset = 20 + i * 42;
buttons[i].Location = new Point(xOffset, yOffset);
buttons[i].BackColor = System.Drawing.SystemColors.Control;
buttons[i].Enabled = false;
buttons[i].Click += new EventHandler(this.clickMe);
buttons[i].Visible = true;
this.Height = yOffset + 104;
this.Width = xOffset + 75;
}
Controls.AddRange(buttons);
}
答案 0 :(得分:3)
虽然您正在从控件集合中删除按钮,但您并未将其从buttons
阵列中删除。添加
Array.Clear(buttons, 0, buttons.Length);
我还修改了删除循环,以显式处理按钮所持有的任何资源,如here on MSDN所示。
for (int i = 0; i < buttons.Length; i++)
{
//you can change break to 'continue' if you remove buttons
//from the array randomly so that if it encounters a null
//it will carry on reading the rest of the array.
if (buttons[i] == null)
break;
//dispose any button resources and event handlers so no references remain
buttons[i].Click -= new EventHandler(this.clickMe);
this.Controls.Remove(buttons[i]);
buttons[i].Dispose();
}
Array.Clear(buttons, 0, buttons.Length);
//..
答案 1 :(得分:-2)
请考虑使用通用列表集合。这允许您使用.Add()和.Remove()/。RemoveAt()方法来更轻松地添加和删除元素。