0

我一直卡在我程序的这一部分。当我调用一个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 时,所有标签都会正确显示。它们都被删除,并根据需要创建的价格重新创建,没有例外。

有什么理由吗?

谢谢你。

4

2 回答 2

9

不要立即在标签上使用“丢弃”。首先删除它们。请注意,您无法修改 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();
}
于 2013-06-19T15:13:05.747 回答
2

我现在无法对此进行测试,但我认为您还应该从添加它们的表单控件集合中删除控件。顺便说一句,在您的情况下,我认为您可以避免 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 从集合中删除元素应该以相反的顺序完成,从集合的末尾到集合的开头

于 2013-06-19T15:12:03.510 回答