Suchleiste funktioniert nicht vernünftig

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

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

    Suchleiste funktioniert nicht vernünftig

    VB.NET-Quellcode

    1. 'Dispose Controls
    2. For Each control As Panel In FlowLayoutPanel1.Controls
    3. control.Dispose()
    4. Next
    5. If currentCatagory = "erfolge" Then
    6. If TextBox1.Text.Length = 0 Then 'If nothing
    7. For Each line In erfolge
    8. Dim Split = line.split(" ")
    9. addPanel(Split(0), Split(1), Split(2), Split(3), Application.StartupPath & "/dats" & Split(4))
    10. Next
    11. ElseIf TextBox1.Text.Length > 0 Then 'If something
    12. For Each line In erfolge
    13. Dim Split = line.split(" ")
    14. If Split(0).ToString.ToLower.Contains(TextBox1.Text.ToLower) Then
    15. addPanel(Split(0), Split(1), Split(2), Split(3), Application.StartupPath & "/dats" & Split(4))
    16. End If
    17. Next
    18. End If
    19. End If


    Guten Tag Community,

    ich benötige mal wieder eure Hilfe. Dies ist ein von mir geschriebener Code, welcher eigentlich super funktionieren sollte(wenn ich mir das so anschaue). Jedoch funktioniert es nur halb. Es ist ein Code für eine Suchleiste, welcher den ersten Begriff einer Zeile aus einer List() nimmt und den mit der Suchleiste im .ToLower abgleicht. Das Problem ist aber, dass er die Panels nicht richtig disposed. Die Prozedur ist wie folgt(damit ihr es euch verbildlichen könnt):

    Ich habe links einen Button, rechts ein FlowLayoutPanel. Im FlowLayoutPanel werden Panels erstellt, welche mir einen Inhalt anzeigen(wird eine Wiki). Die Funktion für die Panels ist auch 100% funktionstüchtig, da bin ich mir sicher. Jedoch, nachdem die Textbox z.B keinen Inhalt hat(.Text.length = 0) zeigt er mir aus irgendeinem Grund, aus nur 3 Vorhandenen Panels ein Duplikat an.

    Kann man vielleicht schon am Code einen Fehler erkennen? Ich vermute immer noch, dass die Panels nicht disposed werden. Der Code ist übrigens im Textbox_TextChanged Event.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

    Sekki schrieb:

    Das Problem ist aber, dass er die Panels nicht richtig disposed.
    Wie äußert sich das?
    Kannst Du das Projekt mal posten?
    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:

    Sekki schrieb:

    Das Problem ist aber, dass er die Panels nicht richtig disposed.

    Kannst Du das Projekt mal posten?


    Ja, im Anhang verfügbar. Falls Du eine Lösung findest, wäre ich dir sehr dankbar, wenn du diese separat in den Thread schreibst. Natürlich sind auch Tipps und Tricks zur Fehlersuche erwünscht, manche posten ja ungerne die Lösung direkt.
    Dateien
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.
    @Sekki Was muss ich tun, um Deinen Effekt zu reproduzieren
    bzw.
    wie soll es richtig laufen?
    ====
    Gib dem TLP Anchor = Top + Bottom + Left + Right
    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:


    Gib dem TLP Anchor = Top + Bottom + Left + Right


    Was meinst du damit?

    Du kannst das Problem reproduzieren, indem du z.B "Hund" eingibst. Hund wird doppelt gefunden, obwohl es Hund nur einmal gibt. Das ist eines der Probleme. Und manchmal(oder immer(?)) wenn man die Textbox leer macht, ist dennoch ein doppelter Eintrag in der Liste.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

    Sekki schrieb:

    Was meinst du damit?

    Function addPanel => Sub addPanel
    Imports System.IO

    VB.NET-Quellcode

    1. Dim erfolge() As String
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. erfolge = IO.File.ReadAllLines(Application.StartupPath & "/dats/erfolge.txt", System.Text.Encoding.Default)
    4. End Sub
    =====
    Arbeite entweder über LoadErfolge_Click oder über TreeTextBox1_TextChanged. Beides verhakt sich gegenseitig.
    Mach zunächst bei TreeTextBox1_TextChanged ein Return rein.
    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
    Ich habe nun die Anchor auf alle Seiten festgelegt(ich weiß nicht, warum, aber es hört sich nicht falsch an) und die Function zu einem Sub gemacht. Könntest du mir dass nochmal erklären? Wieso Sub statt Function? Dann habe ich noch das Form1 Event angepasst, damit dort die List geladet wird und den Array zu einen String gemacht.

    Ich brauche aber beide Events. Links kommen ja noch weitere Kategorien rein. Und beim drücken der Kategorie soll ja alles geladen werden. Und den Return habe ich nun am Ende eingefügt(ich weiß nicht, wo ich den einfügen soll, da ich ja nichts teste).

    Und mir ist etwas aufgefallen: Wenn ich den Button 2x - 3x anklicke(den Kategorie Button "Erfolge"), dann duplizieren sich auch die Inhalte. Anscheinend liegt es also daran, was sich im Button Event befindet:

    VB.NET-Quellcode

    1. currentCatagory = "erfolge"
    2. TextBox1.Text = ""
    3. For Each control As Panel In FlowLayoutPanel1.Controls
    4. control.Dispose()
    5. Next
    6. For Each line In erfolge
    7. Dim Split = line.split(" ")
    8. addPanel(Split(0), Split(1), Split(2), Split(3), Application.StartupPath & "/dats" & Split(4))
    9. Next


    Kann es sein, dass ich anders die Controls disposen muss? Mach ich das überhaupt richtig?

    Edit//
    Ich habe verstanden, warum den Return. Auch mit Return, dupliziert der Button die Einträge.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

    Sekki schrieb:

    Wieso Sub statt Function?
    Sie hat und braucht keinen Rückgabewert.

    Sekki schrieb:

    Ich brauche aber beide Events.
    Dann schreib mal auf, was passieren soll.
    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
    Wenn ich auf die linken Knöpfe drücke, ändert sich die Kategorie. Aktuell gibt es nur "Erfolge". Aber beim Klick auf den Button sollen auch die vorhandenen Inhalte die zu der Kategorie gehören, angezeigt werden. Und diese Inhalte kann man mit der Textbox durchsuchen. Das ist alles, was das Programm können muss.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

    Sekki schrieb:

    Das ist alles, was das Programm können muss.
    Du musst da die Wechselwirkungen beachten.
    Wer darf disposen usw.
    Bedenke, dass beinjedem Tastendruck ein TextChanged-Event ausgelöst wird.
    Vielleicht siehst Du vor, dass eionen Textbox-Eingabe mit einem Enter abgeschlossen werden muss.
    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:

    Bedenke, dass beinjedem Tastendruck ein TextChanged-Event ausgelöst wird.


    Aber das ist doch egal, oder? Weil ja beim letzten Tastendruck, sowieso alles disposed wird. Oder verstehe ich das falsch?
    Hmm.. Mit Enter zu suchen ist für mich keine schöne Idee. Vielleicht gibt es ja noch andere Lösungen. Wie gesagt, der Fehler liegt nicht an der Textbox. Anscheinend reicht es, den "Erfolge" Button 2x zu drücken, um das Programm bereits zu verwirren. Versuch es mal, dann siehst du was ich meine.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

    Sekki schrieb:

    Oder verstehe ich das falsch?
    Mach mal in die beiden Dispose-Schleifen eine Console-Ausgabe rein, damit Du siehst, wie oft die dann aufgerufen werden.
    Zu sehen dann im Ausgabe-Fenster unterhalb des Quellcode-Densters.
    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!
    Moment!
    Ich habe die Lösung gefunden. Ich verstehe nun ganz genau, wieso es nicht immer funktioniert. Anscheinend löscht die .dispose() function auf eine andere Art und Weise(glaube ich).

    Hier ist die Lösung und sie ist ziemlich interessant:
    experts-exchange.com/questions…in-a-flowlayoutpanel.html

    Ich habe den Code(ich glaube C++ oder C#) in VB.net umgeschrieben und es funktioniert:

    VB.NET-Quellcode

    1. ​Sub DisposeFLP()
    2. While FlowLayoutPanel1.Controls.Count > 0
    3. Dim i As Integer = FlowLayoutPanel1.Controls.Count - 1
    4. FlowLayoutPanel1.Controls(i).Dispose()
    5. End While
    6. End Sub


    Danke dir dennoch für deine Hilfe. Wäre ich nicht nach deinen Vorschlägen gegangen, hätte ich wohl nie erkannt, dass es die Dispose Funktion war :)
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.
    Auch so möglich, vermutlich (hab's nicht ausprobiert):

    For each ctrl as Control in FlowLayoutPanel1.Controls
    Ctrl.Dispose()
    Next
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Sekki schrieb:

    umgeschrieben
    sähe das bei mir so aus:

    VB.NET-Quellcode

    1. Sub DisposeFLP()
    2. For i = FlowLayoutPanel1.Controls.Count - 1 To 0 Step -1
    3. FlowLayoutPanel1.Controls(i).Dispose()
    4. Next
    5. End Sub

    @mrMo So stehts im Projekt drinne, was Du offensichtlich nicht angesehen hast.
    Die neue Qualität besteht hier darin, die Objekte von hinten nach vorn zu eliminieren.
    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 Projekt hab ich nicht angeschaut. Bin hier fast immer nur mobil in Forum unterwegs...

    Inhalte aus einer Auflistung löschen, da war ja was... :)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    RodFromGermany schrieb:

    sähe das bei mir so aus:


    Weitaus schöner und kürzer, danke dir!
    Eine frage zu deinem Code hätte ich gerne noch:

    VB.NET-Quellcode

    1. ​For i = FlowLayoutPanel1.Controls.Count - 1 To 0 Step -1

    Diese Zeile verwirrt mich ein wenig. Das bedeutet: Count -1 bis 0 mit -1 Schritten, oder?
    Ein wenig verwirrend, sieht aber gut aus und besser. :/
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.