Dynamisch generierte label löschen

ademo

Mitglied
hallo zusammen

ich habe ein Problem mit dem Löschen von Dynamisch generierten labeln.

1. label Generieren in einem Panel

Code:
        private void tagGenerieren(Control AktivesPanel, DateTime PanelDateTime)
        {
            Produktion.Auftrag.Kalender Kalender = new Produktion.Auftrag.Kalender();

            Kalender.TagLaden(PanelDateTime);

            int rowCount = Kalender.dataSetKalender.Tables["KalenderTag"].Rows.Count;

            Label[] labelTermine = new Label[rowCount];

            int a = 25;

            for (int i = 0; i < rowCount; i++)
            {
                labelTermine[i] = new Label();
                labelTermine[i].Text = Kalender.dataSetKalender.Tables["KalenderTag"].Rows[i]["CoNr"].ToString();
                if (labelTermine[i].Text.ToString().ToCharArray().Length == 5)
                {
                    labelTermine[i].Location = new Point(20, a);
                }
                else
                {
                    labelTermine[i].Location = new Point(10, a);
                }
                labelTermine[i].Font = new Font("Microsoft Sans Serif", 9.75f, FontStyle.Italic);
                labelTermine[i].Name = "labelTermine" + i;
                AktivesPanel.Controls.Add(labelTermine[i]);

                a = a + 20;
            }
        }

label wieder löschen

Code:
        private void clearKalenderMonat()
        {
            tableLayoutPanelKalenderMonat.SuspendLayout();
            foreach (Control panel in tableLayoutPanelKalenderMonat.Controls)
            {
                if (panel.Name.Contains("panelKalendrMonatTag"))
                {
                    if (panel.GetType() == typeof(Panel))
                    {
                        panel.SuspendLayout();

                        foreach (Control ClearLabel in panel.Controls)
                        {
                            if (ClearLabel.Name.StartsWith("labelTermine"))
                            {
                                panel.Controls.Remove(ClearLabel);
                            }
                        }
                        panel.ResumeLayout();
                        panel.Refresh();
                    }
                }
             }
            tableLayoutPanelKalenderMonat.ResumeLayout();
            tableLayoutPanelKalenderMonat.Refresh();
        }

Leider werden nicht alle label gelöscht erst wenn ich das löschen mehrmals durchführe werden alle gelöscht. Es ist als werden ein paar übersprungen in der foreach.

1.jpg

nach einem Durchlauf

2.jpg

nach dem zweiten Durchlauf

3.jpg

usw

Hat jemand eine idee was ich falsch mache?

Danke für die Hilfe

lg Ademo
 

MCoder

Erfahrenes Mitglied
Hallo,

bei einer foreach-Schleife Elemente aus der dafür verwendeten Collection zu löschen, ist keine gute Idee, weil foreach dann natürlich aus dem Tritt kommt. Da musst du dir einen anderen Algorithmus einfallen lassen. Entweder die zu löschenden Controls temporär in einer anderen Collection speichern oder eine for-Schleife verwenden und mit dem letzten Element beginnend von hinten nach vorne löschen.

Gruß
MCoder
 

ademo

Mitglied
Danke dir das wusste ich nicht bin noch Anfänger ;)

Dann werde ich das mal mit einer for schleife versuchen.

Ich habe nun eine Lösung die Funktioniert:

Code:
                        int countLabel = panel.Controls.Count;
                        int j = countLabel - 1;

                        for (int i = 0; i < countLabel; i++)
                        {
                            if (panel.Controls[j].Name.StartsWith("labelTermine"))
                            {
                                panel.Controls[j].Dispose();
                            }
                            j--;
                        }

gibt es noch einen besseren weg oder ist das nun so in Ordnung?
 
Zuletzt bearbeitet:

Turri

Erfahrenes Mitglied
Hallo,

eine For-Schleife kann auch direkt rückwärts, dann brauchst du das "j" nicht.
C#:
int countLabel = panel.Controls.Count;
 
for (int i = countLabel-1; i >= 0; i--)
{
    if (panel.Controls[i].Name.StartsWith("labelTermine"))
    {
        panel.Controls[i].Dispose();
    }
}