我试图做一个winForms应用程序,其中,每个增加numericUpDown应该,最终使面板控件可见,并创建一个文本框控件,一个picturebox,一个numericUpDown控件和三个标签。而每次减少,都应该删除这组控件。我设法编写了创建控件的代码,但我不知道如何删除它们。我唯一的猜测是,为每个控件分配一个名称,然后使用colorPanel.Controls.RemoveByKey()
。不知道如何处理nameTextBoxPositionY
和newLabelPositionY
,在他们目前的状态下,他们可能会把所有事情搞砸。或者我应该放弃,并使用switch(regionNumber)
,手动创建控件,并根据numericUpDown值使它们可见?这将是很繁琐的事,考虑到对的NumericUpDown最大值为10如何以编程方式删除窗体控件
private Label newLabel;
private TextBox nameTextBox;
private NumericUpDown heightNumericUpDown;
private PictureBox colorPictureBox;
private string[] newLabelText = {"Name", "Height", "Color"};
private int newLabelPositionX = -3;
private int newLabelPositionY = 5;
private int nameTextBoxPositionX = 74;
private int nameTextBoxPositionY = 2;
private void numberOfRegions_ValueChanged(object sender, EventArgs e)
{
int regionNumber = Convert.ToInt32(numberOfRegions.Value);
int numberOfLabels = 3;
if (regionNumber > 0)
{
colorPanel.Visible = true;
for (int i = 0; i < regionNumber; i++)
{
nameTextBox = new TextBox();
nameTextBox.Size = new System.Drawing.Size(81, 20);
nameTextBox.Location = new System.Drawing.Point(nameTextBoxPositionX, nameTextBoxPositionY);
colorPanel.Controls.Add(nameTextBox);
nameTextBoxPositionY += 78;
for (int a = 0; a < numberOfLabels; a++)
{
newLabel = new Label();
newLabel.Location = new System.Drawing.Point(newLabelPositionX, newLabelPositionY);
newLabel.Text = newLabelText[a];
colorPanel.Controls.Add(newLabel);
newLabelPositionY += 26;
}
}
newLabelPositionY = 5;
nameTextBoxPositionY = 2;
}
else
{
colorPanel.Visible = false;
}
}
这里的所有答案都有一个非常非常严重的错误。必须**处理您从其父母的Controls集合**中移除的控件。如果不这样做会导致垃圾收集器无法修复的永久内存泄漏。用任务管理器轻松诊断btw,添加USER对象列。您会看到您的流程显示的数量不断增加。您的程序在达到10,000时崩溃。 –
那么应该如何应对这种控制?我想,这并不容易,因为在'for'循环中调用'nameTextBox.Dispose()'。 – amdmcm
只需编写一个存储对这4个控件的引用的小结构。使用'Stack <>'来存储它们。现在很简单。 –