Richtextbox - bestimmte Zeilen gleichzeitig löschen

  • VB.NET

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

    Richtextbox - bestimmte Zeilen gleichzeitig löschen

    Hallo alle zusammen :)

    Ich möchte in einer Richtextbox einen Text einkopieren und bestimmte Zeilen mit einem Button löschen lassen.


    Als Beispiel:
    Die erste Zeile (rot), soll als erstes gelöscht werden.
    Dann die siebte (grün), 13 (blau), 19 usw. Zeilen.
    Also nach der ersten Zeilen, soll immer die derauffolgende 6te Zeile gelöscht werden.
    Das löschen der Zeilen soll gleichzeitig passieren.


    Orc Krieger
    Dalaran. 22
    Eiskrone
    Rabenwehr
    Funkadr. 7779

    Goblin Magier
    Orgrimmar 81
    Eiskrone
    Verließ
    Funkadr. 8644

    Untoter Priester
    Unterstadt 12
    Eiskrone
    Rabenwehr
    Funkadr. 5512

    [usw.]


    Leider weiß ich nicht wie ich das realisieren soll und hoffe, dass mir jemand helfen kann.
    Gruß
    @Elster Wie kopierst Du den Text in die RTB?
    Als Plain Text oder als formatierten RichText?
    Oder fügst Du einfach Lines hinzu?
    Falls der Text nicht formatiert ist:
    Nimm den Text, splitte ihn an den Zeilenenden und mach ein String-Array draus
    Oder
    Nimm das String-Array

    und konvertiere es zu einer List(Of String):

    VB.NET-Quellcode

    1. Dim lines As String() = {} ' Deine Zeilen
    2. Dim liste = lines.ToList()
    Von dieser Liste entfernst Du von hinten nach vorn die nicht gewollten Zeilen
    und fügst sie danach der .Lines-Property der RTB hinzu:

    VB.NET-Quellcode

    1. RichTextBox1.Lines = liste.ToArray()
    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 für die Antwort RodFromGermany

    Ich kopiere den Text aus einer Textdatei direkt in die RTB mit Copy+Paste


    Mein Ansatz sah wie folgt aus:

    VB.NET-Quellcode

    1. RTB.Lines = RTB.Lines.Take(RTB.Lines.Count - 1).ToArray

    Jedoch, wird immer nur die letzte Zeile beim wiederholten klicken des Buttons gelöscht.

    Meine überlegung ist die, dass alle Zeilen der RTB gezählt werden und von unten nach oben, Zeile 6 (
    Untoter Priester) gelöscht wird und der Index für die Zeile 6 plus 6 gerechnet wird und die Zeile 12 (Goblin Magier) gelöscht wird.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Elster“ ()

    Elster schrieb:

    beim wiederholten klicken des Buttons
    Mit welchem Code?
    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!

    Elster schrieb:

    Jedoch, wird immer nur die letzte Zeile beim wiederholten klicken des Buttons gelöscht.
    Genau das macht der Code.
    Was soll er denn machen?
    Wie Du Dein Problem löst, habe ich ja bereits in Post #2 beschrieben.
    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!

    Elster schrieb:

    Meine überlegung ist die, dass alle Zeilen der RTB gezählt werden und von unten nach oben, Zeile 6 (Untoter Priester) gelöscht wird
    Gute Idee - und wo ist das Problem?

    Lass mich raten: Du hast Schwierigkeiten, den höchsten Index iMax zu ermitteln, der beim Rückwärtslauf bei genau 0 endet?
    Weil wennde den hast, ist die Löschschleife ja ein Klacks:

    VB.NET-Quellcode

    1. For i = iMax to 0 step -6
    2. '...


    Probierma so:

    VB.NET-Quellcode

    1. dim lines = rtb.lines
    2. dim iMax = lines.length - lines.length mod 6

    Aber sicher bin ich nicht - musste bisserl rumprobieren

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Elster schrieb:

    Ich weiß nicht, wie ich mit deinem Code gezielt, die Zeilen löschen kann.
    Da solltest Du einfach mal experimentieren und so die richtige Lösung finden.
    Und dann erdfreue uns mit Deiner richtigen Lösung.
    Du merkst hoffentlich, dass Du hier keine fertigen Lösungen geschenkt bekommst. ;)
    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!
    Ich weiß leider nicht mehr weiter.
    Ich habe versucht eine Kombination aus beiden Lösungsvorschlägen irgendwie hin zu bekommen.

    Mein Code sieht bis jetzt so aus:

    VB.NET-Quellcode

    1. Dim list As New List(Of String)
    2. Dim lines = richBox_alterText.Lines
    3. Dim iMax = lines.Length - lines.Length Mod 6
    4. For i As Integer = iMax To 0 Step -6
    5. list.RemoveAt([color=#FF0000] ? [/color])
    6. richBox_alterText.Lines = list.ToArray
    7. Next


    In der For-Schleife soll ja die Löschung der Zeilen stattfinden.
    Aber was benutze ich als Ziel-Index ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Elster“ ()

    Du beginnst bei der letzten Zeile, auf die deine Bedingung (jede 6.) zutrifft, löschst diese, gehst dann von hinten nach vorne (weil sich sonst die Indizes ändern) 6 Zeilen weiter und löschst die wieder etc.

    Elster schrieb:

    Aber was benutze ich als Ziel-Index ?

    Dein Ziel-Index ist dementsprechend 0, da deine Schleife ja am Anfang des Arrays aufhören soll.
    jo, und der Ziel-Index ist mit To 0 ja bereits gecodet - die Schleife lautet ja:

    VB.NET-Quellcode

    1. For i As Integer = iMax To 0 Step -6

    Vlt. kommst du drauf, wenn du sprechender benamst:

    VB.NET-Quellcode

    1. For index As Integer = iMax To 0 Step -6
    Also was gibst du bei list.RemoveAt() als Lösch-Index an?
    Die nächste Zeile ist natürlich Grütze - du willst doch nicht in jeder Schleifen-Umdrehung die Richtextbox-Zeilen neu zuweisen.
    Das machst du bitte lieber nur ein einziges mal, nämlich, nachdem die Schleife komplett durchgelaufen ist.
    Guten Abend alle zusammen.

    Ich saß heute nochmal am Code und komme leider nicht drauf.
    Jeder versuch schlägt fehl und die meiste Zeit bekomme ich den Fehler:

    "System.ArgumentOutOfRangeException: "Der Index lag außerhalb des Bereichs. Er darf nicht negativ und kleiner als die Sammlung sein.
    Parametername: index"

    Ich habe es mit

    VB.NET-Quellcode

    1. list.RemoveAt(index)
    und mit

    VB.NET-Quellcode

    1. list.RemoveAt(0)
    Leider scheint beides falsch zu sein.

    Mein momentaner Code

    VB.NET-Quellcode

    1. Dim list As New List(Of String)
    2. Dim lines = richBox_alterText.Lines
    3. Dim iMax = lines.Length - lines.Length Mod 6
    4. For index As Integer = iMax To 0 Step -6
    5. list.RemoveAt(0)
    6. richBox_alterText.Lines = list.ToArray
    7. Next
    8. richBox_alterText.Lines = list.ToArray

    Hm. Die Liste ist leer, da keine Strings in die Liste (list) implementiert wurde.
    Also muss ich zuerst den Text aus von der Liste lesen, dann durch die For-Schleife mit list.RemoveAt(0) laufen lassen und abschließend mit .Lines = list.ToArray ausgeben.
    Ist das so richtig durchdacht worden?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Elster“ ()

    Elster schrieb:

    VB.NET-Quellcode

    1. list.RemoveAt(0)
    Welche Zeile wird denn hier, so vorhanden, tatsächlich gelöscht?
    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!
    Ich glaube, ich komme der Lösung näher.
    Jetzt werden die ersten 6 Zeilen gelöscht, wenn ich den Button drücke.
    Beim wiederholten drücken, werden die Zeilen 5 dann 4 dann 3 dann 2 und dann immer die erste Zeile gelöscht.


    Mein momentaner Code lautet:

    VB.NET-Quellcode

    1. Dim list As New List(Of String)
    2. Dim lines = RichTextBox1.Lines
    3. Dim iMax = lines.Length - lines.Length Mod 6
    4. list = RichTextBox1.Lines.ToList()
    5. For index As Integer = iMax To 0 Step -6
    6. list.RemoveAt(0)
    7. Next
    8. RichTextBox1.Lines = list.ToArray

    Elster schrieb:

    und dann immer die erste Zeile gelöscht.
    Das war doch nicht der Plan?
    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!
    Aber wenn Du die 1., 7., 13. Zeile löschen willst, warum löschst Du dann mit RemoveAt(0) die mit dem Index 0, also immer die allererste Zeile? Du willst nicht die 1. Zeile löschen, sondern die mit dem Index 0, 6, 12, ... Und diese Zahlenfolge steht doch quasi schon codiert in Deinem Programm
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.