Announcement

Collapse
No announcement yet.

Zur Laufzeit generierte UserControls entfernen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zur Laufzeit generierte UserControls entfernen

    Hallo zusammen, zur Laufzeit generierte UserControls entfernen hörst sich ja nicht so schwer an eigentlich. Ist es aber doch... Zumindest habe ich momentan keine Idee. Die Ausgangssituation:
    In einer TabPage ist ein Usercontroll mit mehreren TextBoxen wenn der Such-Butten geklickt wird dann werden die Eingegeben Daten an eine DB gesendet.

    Jetzt erstelle ich nach dem die DB geantwortet hat für jeden Datensatz eine neune Instanz des Usercontrols und befülle das mit den Daten Das Funktioniert auch soweit ganz gut und bekomme auch alles Angezeigt. Hier mal der Code:

    Code:
    Public Sub Button_person_search_Clicked(sender As System.Object, e As System.EventArgs) Handles Button_person_search.Click
       DBResult = dbcom.searchUser(.......)
    
       Dim UserControlArray(0) As person ' Person ist das Usercontroll
    
       ReDim Array(UBound(DBResult, 1) - 1) ' größe Anpassen
    
            For i As Integer = 0 To (UBound(DBResult, 1) - 1)
                If Not IsNothing(DBResult(i, 0)) Then
                    UserControlArray(i) = New person
    
                    If i > 0 Then
                        'positionieren des Ergebnisse 
                        UserControlArray(i).Location = New Point(10, (UserControlArray(i - 1).Location.Y + UserControlArray(i).Size.Height) + 10)
                    Else
                        UserControlArray(i).Location = New Point(10, newperson.Location.Y + UserControlArray(i).Size.Height + 10)
                    End If
                   
                    'befüllen mit Daten
                    UserControlArray(i).TB_Name.Text = DBResult(i, 1)
            Next
    End Sub
    Jetzt Dachte ich mir das mit Remove alles wieder Verschwindet aber das tut es nicht. Hat jemand eine Lösung/Idee wie ich die "Suchergebnisse" wieder löschen kann? Hatte es schon so Probiert leider ohne erfolg.
    Code:
    For Each o In TabPage_Person.Controls()
                If TypeOf o Is person Then
                    If Not first Then 'Behalte das erste UserControl                    
                        TabPage_Person.Controls.Remove(o)
                    Else
                        first = False
                    End If
                End If
            Next

  • #2
    Jetzt Dachte ich mir das mit Remove alles wieder Verschwindet aber das tut es nicht
    Ist glaube ich richtig gedacht.

    Code:
    For Each o In TabPage_Person.Controls()
    ....              
        TabPage_Person.Controls.Remove(o)
    ....
    Das ist allerdings so nicht möglich. In einem For Each darfst du die Collection über die du iterierst nicht ändern(also hinzufügen oder was wegnehmen). Der Remove in dem Code sollte eigentlich eine entsprechende Exception werfen. Du solltest deinen Code mal an der Stelle prüfen ob du die Exception einfach geschluckt hast und nicht merkst das der Remove nicht ausgeführt wird.

    Comment


    • #3
      Wenn es wirklich an der Schleife liegt und Du es trotzdem in einer Schleife machen willst, dann kannst Du einfach rückwärts durch das Array laufen mit einer normalen for schleife.

      [highlight=c#]
      for(int i = array.Length - 1; i > -1; i--)
      {
      var currentElement = array[i];

      if(currentElement.fulfillsCondition())
      array.Remove(i);
      }
      [/highlight]

      Die Namen der Methoden könnten evtl. nicht ganz richtig sein, aber ich hoffe Du verstehst das Konzept. Rückwärts deswegen, weil das mit dem Index nicht funktioniert wenn man vorwärts zählt, sobald ein Element gelöscht wird.

      Comment


      • #4
        Wenn es wirklich an der Schleife liegt und Du es trotzdem in einer Schleife machen willst, dann kannst Du einfach rückwärts durch das Array laufen mit einer normalen for schleife.

        [highlight=c#]
        for(int i = array.Length - 1; i > -1; i--)
        {
        var currentElement = array[i];

        if(currentElement.fulfillsCondition())
        array.Remove(i);
        }
        [/highlight]

        Die Namen der Methoden könnten evtl. nicht ganz richtig sein, aber ich hoffe Du verstehst das Konzept. Rückwärts deswegen, weil das mit dem Index nicht funktioniert wenn man vorwärts zählt, sobald ein Element gelöscht wird.

        Comment


        • #5
          Hallo,
          leider hat beides nicht geholfen, es wird keine Fehler geworfen an der Stelle und Einzelschritt Debugge durchläuft auch meine For Each auch die Anzahl der Durchläufe stimmt. Auch wenn ich es mit fanderlf vorschlage mache, klappt es nicht. Es wird durchlaufen aber im Tab ist es immer noch zu sehen, auch wenn ich danach die TabPage neu Zeichne.

          Woran könnte es denn sonst noch liegen, oder welche Möglichkeit gäbe es denn noch die entsprechenden UserControlls zu entfernen.

          Comment


          • #6
            oder welche Möglichkeit gäbe es denn noch die entsprechenden UserControlls zu entfernen.
            Controls.Remove ist die Methode. Wenn das nicht funktioniert liegt es in sonstigen Code von dir. Da können wir aus dem bisher gezeigten nicht weiterhelfen.

            Aber allgemein mal nachgefragt. Deine UserControls liegen wirklich alle auf einem TabPage (auf TabPage_Person was dann ja eigentlich TabPage_Personen heißen sollte) und nicht auf verschiedenen? Vielleicht wird nichts entfernt weil das was du glaubst das entfernt werden sollte gar nicht auf diesem TabPage liegt?

            Comment


            • #7
              Ich füge dann immer die erzeugten Objekte mit

              TabPage_Person.Controls.Add(Array(i))

              Anzuhängen.

              Ich werde erst mal tiefer im DEBUG modus suchen.

              Comment

              Working...
              X