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

2

これを今すぐテストすることはできませんが、コントロールを追加した Form Controls コレクションからもコントロールを削除する必要があると思います。ちなみに、あなたの場合、OfType拡張機能を避けて、ループを1つだけ実行できる昔ながらのfor..ループを使用できると思います....

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 に答える