我試圖做一個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 <>'來存儲它們。現在很簡單。 –