Entfernen eines UserControls zur Laufzeit

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Entfernen eines UserControls zur Laufzeit

    Hallo,

    ich habe ein UserControl zur Laufzeit einer TabPage hinzugefügt.
    Es ist sichergestellt, dass dieses UserControl nur 1x auf der TabPage vorhanden sein wird.
    Jetzt möchte ich das UserControl wieder zur Laufzeit entfernen.
    Im Moment mache ich das wie folgt:

    VB.NET-Quellcode

    1. For Each ctl In MyTabCtl.TabPages(iIndexOfTabPage).Controls.OfType(Of MyUserControl)()
    2. If TypeOf ctl Is MyUserControl Then
    3. MyTabCtl.TabPages(iIndexOfTabPage).Controls.Remove(ctl)
    4. ctl.Dispose()
    5. End If
    6. Next


    Gibt es denn eine Möglichkeit das z.B. mit sowas wie:

    VB.NET-Quellcode

    1. If MyTabCtl.TabPages(iIndexOfTabPage).Controls.Contains(MyUserControl) Then


    zu erledigen? Aber hier brauche ich auch eine For..Loop um zunächst MyUserControl zu ermitteln.
    Einfacher wäre es mit einer Abfrage, ob es einen Type von MyUserControl gibt und den dann einfach löschen.
    Ich gehe aber davon aus, weil nicht sichergestellt sein kann, dass es wirklich nur eine Instanz davon gibt, geht sowas nicht?
    @roepke Klick im Designer auf dieses Control und hole Dir seinen Namen und dispose es.
    Feddich.
    ====
    OK, der @ErfinderDesRades war schneller.
    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!
    Danke, aber ich glaube ich muss etwas weiter ausholen.
    Es gibt insgesamt 4 TabPages, jede dieser TabPage hat die Möglichkeit das UserControl anzuzeigen.
    Ob es angezeigt wird oder nicht wird, wird auf der jeweiligen TabPage per ComboBox definiert.
    Wird auf einer TabPage ausgewählt, dass das UserControl dort angezeigt werden soll, dann wird es erzeugt, angezeigt und in eine ArrayList eingetragen.
    Die ArrayList habe ich der List(of T) vorgezogen, weil ich den Typ im Vorfeld nicht festlegen muss künftig mit der ComboBox noch weitere UserControls auswähbar werden sollen, die dann anstelle des jeweils anderen angezeigt werden.
    Da es ja 4 TabPages und 4 ComboBoxen gibt behandle ich die alle 4 in einer Sub.

    VB.NET-Quellcode

    1. Private Sub cboSelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cboTabPage1.SelectedIndexChanged, _
    2. cboTabPage2.SelectedIndexChanged, _
    3. cboTabPage3.SelectedIndexChanged, _
    4. cboTabPage4.SelectedIndexChanged
    5. 'iIndexOfTabPage wird ermiitelt durch sender (hier nicht dargestellt)
    6. Select Case (cboSelectConnectedModuleSPI_CHx.SelectedIndex)
    7. Case 0 'kein UserControl
    8. 'ein evtl. 'MyUserControl1' entfernen
    9. For Each ctl In MyTabCtl.TabPages(iIndexOfTabPage).Controls.OfType(Of MyUserControl)()
    10. If TypeOf ctl Is MyUserControl Then
    11. MyTabCtl.TabPages(iIndexOfTabPage).Controls.Remove(ctl)
    12. MyUserControlArrayList.Remove(ctl)
    13. ctl.Dispose()
    14. End If
    15. Next
    16. Next
    17. Case 1 'MyUserControl1 erstellen und anzeigen
    18. Case 1 'MyUserControl2 erstellen und anzeigen
    19. End Select

    Den Namen des Controls habe ich zu Beginn ja noch nicht im Designer.
    @roepke Nimm eine List(Of UserControl), die funktioniert auch bei Dir.
    Lege die Controls besser in einem Dictionary(Of Integer, UserControl) und pack die Controls da mit dem Index des selektierten Tabs ab.
    Der Tab selbst kennt seinen Index oder Du kannst ihn abfragen, und damit kannst Du aus dem Dictionary genau Dein UserControl abholen und disposen.
    Feddich.
    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!
    Wenn du nicht weisst, welches Control du entfernen willst, dann kannst du es nicht entfernen. Wenn du es aber weisst - oder herausgefunden hast - dann siehe Post#2
    Und ich meine nicht im Designer, sondern ich meine den Code so wie er da steht.
    (Nichtsestotrotz gehört ArrayList natürlich in die Mülltonne - nimm eine List(Of UserControl), wenn du UserControls verwalten willst.)

    ((Und solltest du jemals raw Object verwalten wollen, dann nimm List(Of Object) - ArrayList niemals!))
    Gibt es den einen besonderen Grund warum die UserControls während der Laufzeit hinzugefügt und wieder entfernt werden?

    Ist es nicht sinnvoller die gewünschten UserControls im Designer direkt in das TabPage zu setzten. Die entsprechende Instanz der jeweiligen UserControls können trotzdem in einer ListOfT oder in einer DirectionaryOfT gesammelt und für die Laufzeit verwendet werden. Das jeweilige UserControl das nicht im TabPage gesehen werden darf, einfach auf Visible = False setzen.

    Sollte funktionieren. Also bei meine letzten Projekt hat das perfekt funktioniert, und ich habe sogar die TabPage-Reiter ausgeblendet.

    Freundliche Grüsse

    exc-jdbi
    @roepke

    Ich würde mir dann einfach noch ein paar Gedanken darüber machen, wie die UserControls an die ComboBox gebunden werden.

    Die UserControls habe ich im Desingner nebeneinander gelegt, mit Dock = None, und Visiable = false. Je nach dem welches UserControl dann zur Ansicht in Frage kommt, das dann auf Visible = True und Dock = Fill.

    Ich kann mir aber schon vorstellen, dass ab einer gewissen Komplexität eventuell das Ganze trotzdem ins Stocken kommt. Nur ich hatte das Problem nie. Abhilfe schafft da wiederum ein TabControl im TabPage.

    Werkzeuge für die Gestaltung im TabPage können sein, nebst UserControls TableLayoutPanel, Panel, etc.

    Um es genau abschätzen zu können, müsste man auch mehr über dein Projekt erfahren.

    Freundliche Grüsse

    exc-jdbi