Komisches Verhalten bei control-entfernung

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von HerrBert.

    Komisches Verhalten bei control-entfernung

    Halloooo an alle..
    ich habe ein, für mich komisches, Problem.. Hoffentlich kan mitr einer helfen..

    Mein code erstellt mir immer ein Label und dahinter eine Textbox, genau so viele wie der Benutzer es angegeben hat.
    Bei einem Klick auf den Button "Neu" sollen alle Elemente in dem Tab, bis auf den Button, gelöscht werden.
    ich mache das mti folgendem code:

    VB.NET-Quellcode

    1. For Each c As Control In Me.TC.TabPages(0).Controls
    2. If Not c.Name = "cmdNeu" Then
    3. Me.TC.TabPages(0).Controls.Remove(c)
    4. End If
    5. Next


    Ich habe mir bei jedem Schleifendurchgang einmal den Namen des Controls ausgeben lassen, und es werden nicht alle Elemante gefunden!
    ich muss ca.5 mal bei 10 Labels und Textboxen auf "Neu" klicken, damit alles weg ist... Warum ist das so?
    Ratloser HerrBert..
    Linux wird nie das meistinstallierte Betriebssystem sein. Bedenken Sie nur, wie oft man Windows neu installieren muss!
    :thumbsup:
    Dieser Code entfernt nur die Controls der 1. TabPage. Sind diese Controls irgendwo anders beheimatet?
    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!
    ne, ich möchte auch nur alle der 1.Page löschen... Wie gesagt, bis auch den einen Button..

    Aber, beim 1.Versuch wurden nur die Textboxen gelöscht, beim zweiten Klick die ersten 3 Labels, beim nächsten Klick irgendwelche Labels in der Mitte, und beim 4. Klick war endlich alles weg...
    Beim 2.Versuch wurden nur die Labels gelöscht und dann jede 2. Textbox und so weiter...

    Wenn z.B. nur die Textboxen gelöscht würden, wär es ja ein Fehler bei mir.. aber es ist immer unterschiedlich wie die Elemente gelöscht werden...
    Linux wird nie das meistinstallierte Betriebssystem sein. Bedenken Sie nur, wie oft man Windows neu installieren muss!
    :thumbsup:
    @Vitox:
    Wenn schon, dann

    VB.NET-Quellcode

    1. DoEvents()
    , weil die App, ja ihre Queue abarbeiten muss, nicht fremde Threads.
    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!
    Das funktioniert immer noch nicht...
    Bei meinen versuchen eben wurden als erstes alle Labels gelöscht dann die Textboxen, beim 2. andersherum... Die Schleife kann doch die Elemente nicht übersehen?!
    Ich hab mir alle Namen der gefundenen Elemente ausgeben lassen.. Da wurden wirklich welche nicht gefunden!

    HerrBert
    Linux wird nie das meistinstallierte Betriebssystem sein. Bedenken Sie nur, wie oft man Windows neu installieren muss!
    :thumbsup:
    Schieb vllt. mal ein Stück Code rüber, insbesondere die Erstellung der Controls.
    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!
    Dieser Code wird ausgeführt wenn der Benutser auf "Neu" klickt:

    VB.NET-Quellcode

    1. If Not My.Settings.Modified Then
    2. MsgBox("Sie haben nicht alle Einstellungen angegeben. Konfigurieren sie das Programm bitte richtig")
    3. Else
    4. cmdNeu.visible = False
    5. For i As Integer = 0 To My.Settings.SchülerFragen - 1
    6. Dim l As New Label
    7. l.Name = "lbl" & CStr(i + 1)
    8. l.Text = My.Settings.strFragenSchüler(i)
    9. l.Location = New Point(20, 20 + i * 26)
    10. Me.TC.TabPages(0).Controls.Add(l)
    11. Dim t As New TextBox
    12. t.Name = CStr(i + 1) & "t"
    13. t.Text = ""
    14. t.MaxLength = 1
    15. t.TabIndex = i
    16. t.Size = New Point(80, 20)
    17. t.Location = New Point(210, 17 + i * 26)
    18. AddHandler t.TextChanged, AddressOf textChange_Schüler
    19. Me.TC.TabPages(0).Controls.Add(t)
    20. Next
    21. End If


    In textChange_Schüler wird einfach der Text der Textbox in einem Array gespeichert und wenn man die Einstellungen nicht korrekt angegeben hat, führt er der Code das erstellen der Elemente nicht aus.

    Gelöscht sollen die Elemente dann, wenn man die Einstellungen geändert hat, also löschen und der Benutzer muss wieder auf "Neu" klicken. Vorher wird die Visible-eigenschaft natürlich wieder auf Wahr gestellt.
    Und dieses Löschen funktioniert halt nicht richtig....
    HerrBert
    Linux wird nie das meistinstallierte Betriebssystem sein. Bedenken Sie nur, wie oft man Windows neu installieren muss!
    :thumbsup:

    HerrBert schrieb:


    VB.NET-Quellcode

    1. For Each c As Control In Me.TC.TabPages(0).Controls
    2. If Not c.Name = "cmdNeu" Then
    3. Me.TC.TabPages(0).Controls.Remove(c)
    4. End If
    5. Next

    Man kann doch nicht eine Auflistung vorwärts durchlaufen, und die Items weghauen. Da verändert sich ja die noch zu durchlaufende Auflistung, während du sie durchläufst (wundert mich, dass du keinen Fehler kriegst).

    man musses rückwärts machen.
    okay.. aber wie macht man das am schlausten?. Alle items in ein Array packen, das umdrehen und dann löschen?
    Linux wird nie das meistinstallierte Betriebssystem sein. Bedenken Sie nur, wie oft man Windows neu installieren muss!
    :thumbsup:
    achjaa sche***.. :)
    ungefähr so:

    VB.NET-Quellcode

    1. for i = Me.TC.TabPages(0).Controls.Count to 0 Step -1
    2. Me.TC.TabPages(0).Controls.RemoveAt(i)
    3. Next


    nur dan noch mit abfrage?
    Linux wird nie das meistinstallierte Betriebssystem sein. Bedenken Sie nur, wie oft man Windows neu installieren muss!
    :thumbsup:
    Genau so, und Count - 1, weil die Schleife bis 0 geht.

    VB.NET-Quellcode

    1. Dim c As Control
    2. For i = Me.TC.TabPages(0).Controls.Count - 1 To 0 Step -1
    3. c = Me.TC.TabPages(0).Controls(i)
    4. If c.Name <> "cmdNeu" Then
    5. Me.TC.TabPages(0).Controls.RemoveAt(i)
    6. End If
    7. Next
    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!