Dynamische Anzahl an UserControls einem Panel hinzufügen/bearbeiten

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Dynamische Anzahl an UserControls einem Panel hinzufügen/bearbeiten

    Hallo,

    ich möchte einem Panel eine variable Anzahl an UserControls hinzufügen.
    Ich schaffe es zwar, einem Panel immer mehr UserControls hinzuzufügen, jedoch nicht wieder welche zu entfernen.

    Als Beispiel das ganze mal mit Buttons (müsste ja aufs selbe hinauslaufen?):

    C#-Quellcode

    1. private void button_Click(object sender, EventArgs e)
    2. {
    3. for (int i = 0; i < anz; i++)
    4. {
    5. butt = new Button();
    6. butt.Click += butt_Click;
    7. flowLayoutPanel1.Controls.Add(butt);
    8. }
    9. }
    10. private void numericUpDown1_ValueChanged(object sender, EventArgs e)
    11. {
    12. anz = Convert.ToInt32(numericUpDown1.Value);
    13. }


    Hiermit kann ich mit einem numericUpDown die Anzahl der neuen Buttons auswählen und die Buttons dem Panel zufügen. Jedoch bleiben alle bereits hinzugefügten Buttons erhalten.
    Ziel ist es aber, mit dem numericUpDown die gesamte Anzalh an Controls auszuwählen.

    Habe auch schon überlegt, das ganze mit einem Array of Controls zu machen, um die Elemente einfacher ansprechen zu können (sinnvoll?)

    Danke im Vorraus.
    Habe auch schon überlegt, das ganze mit einem Array of Controls zu machen, um die Elemente einfacher ansprechen zu können (sinnvoll?)

    Diese Liste hast du doch schon als flowLayoutPanel1.Controls (.Count usw)

    um bei deinen NumericUpDown die richtige Anzahl zu haben müsstest du in etwa so vorgehen:

    Quellcode

    1. .. Bei Wertänderung Numericupdown:
    2. Solange wie flowlayputpanel1.controls.count <> numericpupdown.value
    3. Wenn Anzahl Controls > NumWert Dann Entferne z.B. erstes oder Letztes Control (flowlayoutpangel.controls.removeat(0))
    4. Wenn Anzahl Contorls < numWert dann ADD control (flowlayoutpanel.controls.add)
    5. ende schleife

    Bei Buttons & Co nicht vergessen, die entsprechenden Handler hinzuzufügen/entfernen
    Danke für die hilfreichen Antworten, werde es gleich mal ausprobieren.

    Es geht letztendlich um 5-10 Controls. Ist es da dann nicht sinnvoller, bei jedem Werte-Wechsel alle Controls zu löschen und neu zu instanzieren?

    Angry Onion schrieb:

    zu löschen und neu zu instanzieren?
    Das könnte zu einem Flackern führen.
    Gib den Controls sinnvolle Namen, da kannst Du sie darüber auch gesittet ansprechen und löschen:

    VB.NET-Quellcode

    1. Me.Panel1.Controls("CheckBox1").Dispose()
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es geht letztendlich um 5-10 Controls. Ist es da dann nicht sinnvoller, bei jedem Werte-Wechsel alle Controls zu löschen und neu zu instanzieren?

    Wozu was löschen, was du in 1 sec danach wieder brauchst und neu erstellst.
    über ...controls(x).... kannst du doch jeden ansprechen z.B. für die Vergabe neuer Namen usw.

    Schon mal überlegt, ob es vielleicht sinnvoll ist, alle 10 Controls zu erstellen, und je nach Anzahl diese Sicht-; oder Unsichtbar zu machen?
    Wäre auch eine Möglichkeit, die. u.U. sogar einfacher ist.

    RoulettePilot schrieb:

    Schon mal überlegt, ob es vielleicht sinnvoll ist, alle 10 Controls zu erstellen, und je nach Anzahl diese Sicht-; oder Unsichtbar zu machen?
    Wäre auch eine Möglichkeit, die. u.U. sogar einfacher ist.

    Ja, aber so ist man natürlich nicht flexibel nach oben, wenn es doch mal ein paar mehr werden sollen.

    RodFromGermany schrieb:

    VB.NET-Quellcode

    Me.Panel1.Controls("CheckBox1").Dispose()

    RoulettePilot schrieb:

    über ...controls(x).... kannst du doch jeden ansprechen z.B. für die Vergabe neuer Namen usw.


    Wie kann ich denn einzelne Controls mithilfe des Namens oder des Indexes in C# ansprechen? Controls(x) und Controls("Button1") funktioniert in C# nicht.

    Angry Onion schrieb:

    in C#
    mach es mal so:

    C#-Quellcode

    1. Control.ControlCollection ctrl = this.panel1.Controls;
    2. ctrl.RemoveByKey("checkBox1");
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    mach es mal so:
    C#-Quellcode

    Control.ControlCollection ctrl = this.panel1.Controls;
    ctrl.RemoveByKey("checkBox1");


    Das mit RemoveByKey("CkeckBox1"); funktioniert auch direkt:

    C#-Quellcode

    1. this.Panel1.Controls.RemoveByKey("CkeckBox1");


    Aber was, wenn ich jetzt auf die Eigenschaften von einem bestimmten Control zugreifen möchte?

    Angry Onion schrieb:

    Eigenschaften
    Da musst Du Dir halt das Control holen:

    C#-Quellcode

    1. CheckBox cb = this.panel1.Controls["checkBox1"] as CheckBox;
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Angry Onion schrieb:

    runden Klammern
    Solch Fehler macht der automatische Übersetzer VB.NET => C#.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Angry Onion schrieb:

    passieren
    Jou, das ist so, allerdings entwickelst Du ein feines Gespürfür die Intellisense- und Compilermeldungen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!