簡體   English   中英

刪除動態創建的控件

[英]Delete dynamically created controls

我一直陷於程序的這一部分。 每當我調用listbox.selectitemchange事件時,我都希望顯示適當數量的跟蹤欄和標簽。

現在,它不能正常工作。 其中的一些會在事件調用時被刪除,而有些則不會。

foreach (Label label in Controls.OfType<Label>())
{
    if (label.Tag != null && label.Tag.ToString() == "dispose")
    {
        label.Dispose();
    }
}

foreach (TrackBar trackBar in Controls.OfType<TrackBar>())
{
    if (trackBar.Tag != null && trackBar.Tag.ToString() == "dispose")
    {
        trackBar.Dispose();
    }
}


    for (int i = 0; i < calc; i++)
    {
        //string[] LineWidthSplitted = lines[lineWidth].Split(' ');
        //Int32.TryParse(LineWidthSplitted[2], out WidthValue);


        Label Label = new Label();
        Label.Name = "TrackbarWidth" + LabelName++;
        Label.Tag = "dispose";
        Label.Text = "Board -" + LabelName + "- Height:";
        Label.Location = new Point(10, 450 + (50 * LabelName));
        Label.Size = new System.Drawing.Size(100, 25);
        this.Controls.Add(Label);



        TrackBar trackBar = new TrackBar();
        trackBar.Name = "TrackbarWidth" + trackbarName++;
        trackBar.Tag = "dispose";
        trackBar.Maximum = 85;
        trackBar.Minimum = 65;
        trackBar.SmallChange = 5;
        trackBar.TickFrequency = 5;
        trackBar.Value = 65;
        trackBar.Location = new Point(150, 450 + (50 * trackbarName));
        trackBar.Size = new System.Drawing.Size(100, 25);
        this.Controls.Add(trackBar);


        lineWidth += 4;

    }

同時,當我刪除軌跡欄的foreach時,所有標簽都會正確顯示。 它們都將被刪除,並針對需要創建的prices量重新創建,沒有例外。

有什么原因嗎?

謝謝。

不要立即在標簽上使用“處理”。 首先將其刪除。 請注意,您無法在foreach中修改Controls集合,因此必須執行以下操作:

List<Label> itemsToRemove = new List<Label>();
foreach (Label label in Controls.OfType<Label>())
{
    if (label.Tag != null && label.Tag.ToString() == "dispose")
    {
        itemsToRemove.Add(label);
    }
}

foreach (Label label in itemsToRemove)
{
    Controls.Remove(label);
    label.Dispose();
}

如果要一鍵刪除所有不同種類的控件,請執行以下操作:

List<Control> itemsToRemove = new List<Control>();
foreach (Control ctrl in Controls)
{
    if (ctrl.Tag != null && ctrl.Tag.ToString() == "dispose")
    {
        itemsToRemove.Add(ctrl);
    }
}

foreach (Control ctrl in itemsToRemove)
{
    Controls.Remove(ctrl);
    ctrl.Dispose();
}

我現在無法對此進行測試,但是我認為您還應該從添加控件的“表單控件”集合中刪除控件。 順便說一句,在您的情況下,我認為您可以避免OfType擴展,而使用老式的for..loop,它將只執行一個循環。

for(int x = this.Controls.Count - 1; x >= 0; x--))
{
    Control ctr = this.Controls[x]; 
    if (ctr Is Label && ctr.Tag != null && ctr.Tag.ToString() == "dispose")
    {
        this.Controls.Remove(ctr);
        ctr.Dispose();
    }
    if(ctr Is TrackBar && ctr.Tag != null && ctr.Tag.ToString() == "dispose")
    {
        this.Controls.Remove(ctr);
        ctr.Dispose();
    }
}

請注意,如何使用for..loop從集合的結尾到集合的開頭以相反的順序刪除元素

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM