私はwinFormsアプリケーションを作成しようとしています。ここで、numericUpDownの各値を増やすと、パネルコントロールが表示され、テキストボックスコントロール、ピクチャボックス、numericUpDownコントロール3つのラベル。それぞれの減少は、このコントロールのグループを削除する必要があります。私は、コントロールを作成するコードを記述することができましたが、私はそれらを削除する方法がわかりません。私の唯一の推測は、すべてのコントロールに名前を割り当てて、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 <>'を使います。今は簡単です。 –