Laden...

[gelöst] erstellte labels wieder loeschen?

Erstellt von Pain vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.810 Views
P
Pain Themenstarter:in
34 Beiträge seit 2008
vor 15 Jahren
[gelöst] erstellte labels wieder loeschen?

hey folgendes habe ich gemacht da ich an nem admin tool fpr ein browsergame arbeite was auf dem client laufen soll. Folgendes problem : ich weiß wie man labels erstrellt, per for nur wie bekomme ich diese wieder weg und 2tens wie bekomme ich diese in ein panel?

        private void passwortÄndernToolStripMenuItem_Click(object sender, EventArgs e)
        {
            int x = 3;
            int y = 56;
            Label[] lbls = new Label[100];

            for (int i = 0; i < 5; i++)
            {
                y += 20;
                //Instanz erzeugen
                
                lbls[i] = new Label();
                //Eigenschaften setzen u.ä.
                //panel1.Controls.Add(lbls[i]);
                lbls[i].Parent = panel1;
                lbls[i].Text = "Hallo";
                lbls[i].AutoSize = true;
                lbls[i].Location = new Point(3, y);
                //Label zur Form hinzufügen
                
                this.Controls.Add(lbls[i]);
            }
        }

aufrufen tue ich die funktion wenn ich im menü (menustrip) per click drauf. Folgendes möchte ich: alle erstellten Labels sollen im panel (panel1) erstellt werden und wie kann ich die erstellten labels wieder loeschen falls ich zb. im menü auf ein anderes objekt klicke, gibts dafür bessere ideen(fürs menü)?

Danke im vorraus

5.299 Beiträge seit 2008
vor 15 Jahren

Dynamisch Controls erzeugen und löschen ist 'ne ziemliche Fummelarbeit, die zu vermeiden mir bisher fast immer gelang.

Erstmal zu deiner Frage:
Wenn die Labels aufs Panel sollen, musstese der ControlCollection des Panels hinzufügen.

this.panel1.Controls.Add(lbls[i]);

Und wenndese wieder wegmachen willst, musstese removen (und disposen!).

gibts dafür bessere ideen(fürs menü)?

Wie gesagt, Dialoge im Designer designen ist wesentlich einfacher. Ich finde da das TabControl ziemlich praktisch, da kann man die angezeigten Seiten sehr nett umschalten.
Das kann man auch über Menü machen. Bei FramesetLike isses zwar über eine Listbox gemacht, aber das Prinzip ist eigentlich gleich.

Der frühe Apfel fängt den Wurm.

P
Pain Themenstarter:in
34 Beiträge seit 2008
vor 15 Jahren

removen und disposen sagt mir nicht viel, das mit dem tabs hab ich mir schon gedacht allerdings wären das ca 50 tabs von daher etwas unpraktisch

1.044 Beiträge seit 2008
vor 15 Jahren

Hallo Pain,

removen und disposen sagt mir nicht viel, das mit dem tabs hab ich mir schon gedacht allerdings wären das ca 50 tabs von daher etwas unpraktisch

dann wäre es doch sinnvoll in der MSDN-Dokumentation nachzulesen oder sich ein Buch zu schnappen. :rtfm: 🛈

Hier findest du Informationen und Beispiele: MSDN: Control.Dispose-Methode (Boolean) . Ich jedoch finde es sinnvoller, wenn mach einfach das Control, was du "verstecken" möchtest mit dem Property Visable auf false setzt.

zero_x 😉

P.S.: Ich würde im Quellcode keine Sonderzeichen, wie ä, ü, ö, ect. verwenden, da es auch einige Nachteile hat ... .

P
Pain Themenstarter:in
34 Beiträge seit 2008
vor 15 Jahren

hm naja geht um datenbanken abfragen und das sind dann ca 30 labels + inputs und wenn ich die dann alle verstecken soll 😠

1.044 Beiträge seit 2008
vor 15 Jahren

Hallo Pain,

wie wäre es mit einer foreach-Schleife? Hier ein keines Beisiel:

foreach (Control c in Controls)
{
    // Hier das verstecken der Controls
}

zero_x

P
Pain Themenstarter:in
34 Beiträge seit 2008
vor 15 Jahren

hm ich würde sie schon gerne löschen via forschleife :7 bekommes nur irgendwie nicht hin. Werde nun erstmal ins bett gehen, danke für eure bemühungen =)

Gruß

P
Pain Themenstarter:in
34 Beiträge seit 2008
vor 15 Jahren

sry 4 doppel post, das loeschen funtzt nun nur wie geht das mit dem panel? habe eins defeniert nur ich kann dort nicht reinschreiben

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Pain,

siehe [Hinweis] Wie poste ich richtig? Punkt 5.

herbivore

P
Pain Themenstarter:in
34 Beiträge seit 2008
vor 15 Jahren
            for (i = menu123; i < menu12 + menu123; i++)
            {
                y += 20;
                //Instanz erzeugen
                lbls[i] = new Label();
                //Eigenschaften setzen u.ä.
                lbls[i].Parent = panel1;
                lbls[i].Text = "Hallo";
                lbls[i].AutoSize = true;
                lbls[i].Location = new Point(3, y);
                //Label zur Form hinzufügen
                this.panel1.Controls.Add(lbls[i]);
                this.Controls.Add(lbls[i]);
            }

this.Controls.Add(lbls_); geht nicht. labels werden alle erstellt, allerding nicht in dem panel sondern ganz normal in der form

J
3.331 Beiträge seit 2006
vor 15 Jahren

Der letzte Befehl muss raus: Nach der Zuweisung im Panel stehen sie schon richtig.

Was heißt eigentlich "geht nicht"? Das ist keine ausreichende Fehlerbeschreibung. Durch die Zuweisung in das Formular würdest Du die Zuweisung ins Panel faktisch rückgängig machen; das geht aber nicht, weil ein Control nur in einem Container enthalten sein kann - entweder das Panel oder das Formular.

Jürgen

P
Pain Themenstarter:in
34 Beiträge seit 2008
vor 15 Jahren
            for (i = menu123; i < menu12 + menu123; i++)
            {
                y += 20;
                //Instanz erzeugen
                lbls[i] = new Label();
                //Eigenschaften setzen u.ä.
                lbls[i].Parent = panel1;
                lbls[i].Text = "Hallo";
                lbls[i].AutoSize = true;
                lbls[i].Location = new Point(3, y);
                //Label zur Form hinzufügen
                //this.Controls.Add(lbls[i]); // überlüssig
            }

geht nicht = kein effekt, auch nach dem rausloeschen... ich weiß da ehrlichgesagt nimmer weiter 😕.
Normalerweise müsste es(das label) ja in dem pannel sein ( in der mitte meiner form) nur es ist trotzdem immer in der form oben links in der ecke.

wie dumm kann man sein... sry

für die die genau so dumm sind wie ich -_-*

es muss so heißen:

            for (i = menu123; i < menu12 + menu123; i++)
            {
                y += 20;
                //Instanz erzeugen
                lbls[i] = new Label();
                //Eigenschaften setzen u.ä.
                lbls[i].Parent = panel1;
                lbls[i].Text = "Hallo";
                lbls[i].AutoSize = true;
                lbls[i].Location = new Point(3, y);
                //Label zur Form hinzufügen
                //this.panel1.Controls.Add(lbls[i]);
            }
49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Pain,

Widerspruch:

lbls[i].Parent = panel1; //Label zum Panel hinzufügen
this.Controls.Add(lbls[i]); //Label zur Form hinzufügen

Der letzte Befehl muss raus:

so ist es

herbivore

J
3.331 Beiträge seit 2006
vor 15 Jahren

@herbivore
Die Zuweisung von Parent habe ich übersehen.

@Pain
Ich sagte doch auch, dass der letzte Befehl (die Zuweisung an this.Controls) raus muss!

Jürgen

P
Pain Themenstarter:in
34 Beiträge seit 2008
vor 15 Jahren

siehe edit -_-* sry dafür..

Danke an alle, kann, falls nötig, geclosed werden

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Pain,

doppelt gemoppelt

lbls[i].Parent = panel1;           //Label zum Panel hinzufügen
this.panel1.Controls.Add(lbls[i]); //Label zum Panel hinzufügen

herbivore

P
Pain Themenstarter:in
34 Beiträge seit 2008
vor 15 Jahren

hmm ist es möglich die erstellten labels via foreach zu loeschen?

                foreach (Label i1 in lbls)
                {
                    Controls.Remove(lbls[i]);
                    lbls[i].Dispose();
                }

geht natürlich nicht da die foreach von 1-100 geht da ich Label mit einem index von 100 defeniert habe. ist es irgendwie möglich eine bedingung in die foreach zu geben sodass ich nur lbls[ (zb. 1-3) ] loesche?

J
3.331 Beiträge seit 2006
vor 15 Jahren

Löschen geht mit der for-Schleife; wegen der Indizes musst Du vom Maximum aus runter nach 0 gehen. Jürgen

U
1.688 Beiträge seit 2007
vor 15 Jahren

Und wenndese wieder wegmachen willst, musstese removen (und disposen!).

Autsch!

P
Pain Themenstarter:in
34 Beiträge seit 2008
vor 15 Jahren

Löschen geht mit der for-Schleife; wegen der Indizes musst Du vom Maximum aus runter nach 0 gehen. Jürgen

aber nicht wenn ich auch noch buttons usw habe 😉
für die anderen:


               int cnt = 0;
                foreach (Label i1 in lbls)
                {
                    if (i1 != null)
                    {
                        Controls.Remove(lbls[cnt]);
                        lbls[cnt].Dispose();
                    }
                    cnt++;
                }
                cnt = 0;
1.044 Beiträge seit 2008
vor 15 Jahren

Hallo Pain,

natürlich kannst du es mit es einer for-Schleife durchlaufen und in der Schleife eine if-Abfrage machen ob das Control ein Label ist. juetho ist völlig recht.

Hier ein Beispiel:

// Mit einer for-Schleife:
for (int i = 0; i < this.Controls.Count; i++)
{
    if (Controls[i] is Label)
    {
        Controls[i].Visible = !Controls[i].Visible; // Alle Labels ein- und auslenden
    }
}

// mit einer foreach-Schleife:
foreach (Control c in Controls)
{   
    if (c is Label)
    {
        c.Visible = !c.Visible; // Alle Labels ein- und auslenden
    }
}

zero_x 😉