none
Controls zur Laufzeit erzeugen und entferne RRS feed

  • Frage

  • Hallo zusammen,

    ich will / muss Controlls zur Laufzeit erstellen und auch entfernen. Auf einer TabPage liegt ein UserControll mit zwei Buttons und ein parr TextBoxen.
    Das hinzufügen mehrer Controlls Funktioniert, nur das entfernen leider nicht, da wird nur ein Teil entfernt und ich habe keine Ahung warum.

    Hier mal mein Code

        Public mytest As Object = New Individuals
        Private Sub Button_ADD_Click(sender As System.Object, e As System.EventArgs) Handles Button_ADD.Click
    
            For i As Integer = 0 To 10
                'test.Parent = Me
                mytest.Name = "TestIndi_" & CStr(i)
                mytest.TextBox1.Text = "Jaja"
                mytest.Location = New Point(0, (i + 1) * 400)           
                Main.TabPage2.Controls.Add(mytest)
            Next
    
        End Sub
    
        Private Sub Button_REMOV_Click(sender As System.Object, e As System.EventArgs) Handles Button_REMOVE.Click
            Main.RemoveControl()
            Dim Count As Integer = 0
            For Each o As Object In Main.TabPage2.Controls
                If TypeOf o Is Individuals Then
                    Count += 1
                    Main.TabPage2.Controls.Remove(o)
                End If
            Next
            MessageBox.Show(Count, "Gezählt")
        End Sub
    

    Mit der SUB Button_REMOV_Click wird aber nur jedes zweite UserControl entfernt und ich habe keine Ahung warum das so ist. Hat jemand eine Idee was ich falsch mache?

    Donnerstag, 12. Januar 2012 11:26

Antworten

  • Hallo,

    ich hatte da zwar heute morgen ein wenig C# VB Mischmasch geschrieben, was Du aber richtig korrigiert hast.
    (Und der Variablen-Name controls ist etwas unglücklich gewählt, da auch anderweitig verwendet.

    Wenn es bei Dir schief geht müssen da noch andere Bedingungen hinzukommen,
    wenn folgendes (etwas besser benamst) schiefgeht:

    Option Strict On
    Option Infer On
    
    Imports System.Linq
    
    ' Ist eine List(Of Individuals)
    Dim controlsToRemove = Main.TabPage2.Controls.OfType(Of Individuals)().ToList()
    Console.WriteLine("Controls found " & controls.Count.ToString())
    For Each controlToRemove In controlsToRemove
        Main.TabPage2.Controls.Remove(controlToRemove)
    Next

    Wegen der bereits angesprochenen "objects":

    Könnte es sein dass Du mit Option Strict Off und/oder Option Infer Off unterwegs bist.
    Dann sind Seiteneffekte durch die Visual Basic "Pseudo-Intelligenz" nicht ausgeschlossen.
    Da gilt die grundsätzliche Empfehlung: Immer beides aktivieren, am besten auf Projektebene.

    Gruß Elmar

    Donnerstag, 12. Januar 2012 17:22

Alle Antworten

  • Hallo,

    da Du beim Durchlaufen der Auflistung jeweils das vordere Steuerelement entfernst,
    "überspringt" der Enumerator beim nächsten Durchlauf das darauf folgende.

    Um das zu verhindern musst Du entweder von hinten anfangen und mit
    For index As Integer = Main.TabPage2.Controls.Count - 1 To 0 Step -1

    arbeiten. Oder - einfacher - zuerst die Steuerelemente filtern und in eine Auflistung übertragen.
    Dabei kann LINQ mit OfType Hilfreich sein:

     Dim controls =  Main.TabPage2.Controls.OfType<Individuals>().ToList();
    

    Diese Auflistung kannst Du fürs entfernen verwenden:

       For Each control In controls
            Main.TabPage2.Controls.Remove(control)
       Next
    

    und mit controls.Count hast Du nebenbei gleich die Anzahl.

    Nebenbei solltest Du auf As Object wenn möglich verzichten, wie z. B.:

    Public mytest As Object = New Individuals
    ' besser:
    Public mytest As New Individuals()
    
    For Each o As Object In Main.TabPage2.Controls
    ' besser:
    For Each o As Control In Main.TabPage2.Controls
    
    
    
    

    und in Verbindung mit Option Infer kann man das weiter verkürzen,
    wie ich es oben es beim Dim controls = ... gemacht habe.

    Gruß Elmar

    Donnerstag, 12. Januar 2012 12:26
  • Hi Elmar,

    vilen Dank für die Antwort, mir war nicht klar, das der Enumerator beim nächsten Durchlauf das darauf folgende überspringt.

    Aber eine Frage hätte ich da dann doch noch, zum Remove. Die Auflistung erstelle / Definiere ich so:

    Dim controls = main.TabPage2.Controls.OfType(Of Individuals).ToList()
    
    For i As Integer = 0 To 10 
    	Dim mytest As New Individuals()
    	mytest.Name = "TestIndi_" & CStr(i)
    	controls = mytest 
    	main.Tabpage2.Controls.add(controls)
    Next

    Das funktioniert auch. Nur das Remove leider nicht bzw. nicht so:

     

    For Each control In controls
            Main.TabPage2.Controls.Remove(control)
       Next

    Die Exception lautet Das Objekt des Typs "Individuals" kann nicht in Typ "System.Collections.IEnumerable" umgewandelt werden. Ich kann die controls nur Löschen wenn ich Sie, wie du Vorgeschlagen hast, von hinten her löschen.

    Donnerstag, 12. Januar 2012 16:20
  • Hallo,

    ich hatte da zwar heute morgen ein wenig C# VB Mischmasch geschrieben, was Du aber richtig korrigiert hast.
    (Und der Variablen-Name controls ist etwas unglücklich gewählt, da auch anderweitig verwendet.

    Wenn es bei Dir schief geht müssen da noch andere Bedingungen hinzukommen,
    wenn folgendes (etwas besser benamst) schiefgeht:

    Option Strict On
    Option Infer On
    
    Imports System.Linq
    
    ' Ist eine List(Of Individuals)
    Dim controlsToRemove = Main.TabPage2.Controls.OfType(Of Individuals)().ToList()
    Console.WriteLine("Controls found " & controls.Count.ToString())
    For Each controlToRemove In controlsToRemove
        Main.TabPage2.Controls.Remove(controlToRemove)
    Next

    Wegen der bereits angesprochenen "objects":

    Könnte es sein dass Du mit Option Strict Off und/oder Option Infer Off unterwegs bist.
    Dann sind Seiteneffekte durch die Visual Basic "Pseudo-Intelligenz" nicht ausgeschlossen.
    Da gilt die grundsätzliche Empfehlung: Immer beides aktivieren, am besten auf Projektebene.

    Gruß Elmar

    Donnerstag, 12. Januar 2012 17:22
  • Hallo EL_loro,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 2. Februar 2012 18:15