Richtextbox Zeilenumbruch automatisch erzeugen

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

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Westerwälder.

    Richtextbox Zeilenumbruch automatisch erzeugen

    Guten Morgen,

    möchte gerne Textpassagen (meist aus Webseiten) in ein Datagridview einfügen.
    Dazu habe habe ich eine Richtextbox

    VB.NET-Quellcode

    1. DataFormats.GetFormat(DataFormats.Text)
    erstellt.
    Es kommt vor, dass die befüllten Lines mehr Zeichen enthalten, wie gewünscht.
    Nach Übernahme ins DGV sind diese Zeilen nicht vollständig lesbar.
    Eine MaxLengh für Lines gibt es wohl nicht.

    Ist es möglich einen Zeilenumbruch bei einer bestimmten Textlänge zu erzeugen?
    Gruß Markus
    Du müsstest einfach die Textlänge überprüfen (Richtextbox1.Length) und bei deinem gewünschten Wert eine neue Zeile starten (vbCrLf fügt einen einfachen Zeilenumbruch hinzu). Oder hab ich deine Frage gerade komplett missverstanden?

    LG
    Bitte benutze OPTION STRICT ON.
    Und optional OPTION EXPLICIT ON.
    Hier ein CODE-CONVERTER.

    Suchanfragen-Ansatz für GOOGLE.
    Prüfe deinen Beitrag in einer RECHTSCHREIBPRÜFUNG.

    @Akanel jup geht beides. vbcrlf fiel mir jz als erstes ein.
    @Westerwälder okay :)

    LG
    Bitte benutze OPTION STRICT ON.
    Und optional OPTION EXPLICIT ON.
    Hier ein CODE-CONVERTER.

    Suchanfragen-Ansatz für GOOGLE.
    Prüfe deinen Beitrag in einer RECHTSCHREIBPRÜFUNG.

    Habe folgendes versucht

    VB.NET-Quellcode

    1. Private Sub TS_Textformatierung_Click(sender As Object, e As EventArgs) Handles TS_Textformatierung.Click
    2. If Me.Halt Then Exit Sub
    3. Dim ZeilenLaenge As Integer = 15 ' Standardwert 15 zum testen
    4. Dim LineTextA As String = Nothing
    5. Dim LineTextB As String = Nothing
    6. For I As Integer = 0 To Me.RichTextBox_Input.Lines.Count - 1
    7. If Me.RichTextBox_Input.Lines(I).Length > ZeilenLaenge Then
    8. LineTextA = Strings.Left(Me.RichTextBox_Input.Lines(I), ZeilenLaenge)
    9. LineTextB = Strings.Right(Me.RichTextBox_Input.Lines(I), (Me.RichTextBox_Input.Lines(I).Length - ZeilenLaenge))
    10. Me.RichTextBox_Input.Lines(I) = LineTextA & vbNewLine & LineTextB
    11. End If
    12. Next I
    13. MessageBox.Show("Text wurde formatiert.", Me.MessTitel, MessageBoxButtons.OK, MessageBoxIcon.Information)
    14. End Sub

    Habe da wohl ein Denkfehler:
    1. Die Richtextbox bleibt unverändert.
    2. Möchte ja nicht genau nach 15 Zeichen abschneiden, sondern so das der Gesamttext logisch erhalten bleibt, also nach dem nächsten Wort.
    Gruß Markus
    Du kannst der RTB die neuen Zeilen im Gesamtpaket übergeben, aber nicht einzeln verändern. Wäre durch folgenden Test sichtbar gewesen:

    VB.NET-Quellcode

    1. For I As Integer = 0 To Me.RichTextBox_Input.Lines.Count - 1
    2. Me.RichTextBox_Input.Lines(I) = ""
    3. Next

    Da passiert nämlich nix (bei mir).
    Versuch mal, ohne Microsoft.VisualBasic-Namespace (im Forum häufiger »Deppen-Namespace« genannt, da quasi VB6) zu arbeiten.
    Selbst wenn es denn mit der Zuweisung klappen würde, würde LineTextB immer noch > 15 sein.
    Da Du nur zwischen ganzen Wörtern trennen willst, braucht es noch eine Leerzeichensuche statt einem festen Abschneiden.
    Probier mal:

    VB.NET-Quellcode

    1. Private Sub TS_Textformatierung_Click(sender As Object, e As EventArgs) Handles TS_Textformatierung.Click
    2. If Me.Halt Then Exit Sub
    3. Dim NewRtbLines As New List(Of String)
    4. For Each RtbLine In Me.RichTextBox_Input.Lines
    5. NewRtbLines.AddRange(SplitIntoPieces(RtbLine))
    6. Next
    7. RichTextBox_Input.Lines = NewRtbLines.ToArray
    8. End Sub
    9. Private Function SplitIntoPieces(TextLine As String) As IEnumerable(Of String)
    10. Dim MinimumLineLength = 15
    11. If TextLine.Length <= MinimumLineLength Then Return {TextLine}
    12. Dim FinalTextLines As New List(Of String)
    13. Dim PositionOfSpaceAfterMinimumLength = TextLine.IndexOf(" ", MinimumLineLength)
    14. If PositionOfSpaceAfterMinimumLength = -1 Then Return {TextLine}
    15. FinalTextLines.Add(TextLine.Substring(0, PositionOfSpaceAfterMinimumLength))
    16. If TextLine.Length > PositionOfSpaceAfterMinimumLength + 1 Then FinalTextLines.AddRange(SplitIntoPieces(TextLine.Substring(PositionOfSpaceAfterMinimumLength + 1)))
    17. Return FinalTextLines
    18. End Function

    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.
    hmh okay, aber warum eigentlich der Aufwand? Wenn man in einem DGV etwas nicht vollständig lesen kann, hat der Benutzer doch die Möglichkeit die betroffenen Spalte zu strecken, oder?

    LG
    Bitte benutze OPTION STRICT ON.
    Und optional OPTION EXPLICIT ON.
    Hier ein CODE-CONVERTER.

    Suchanfragen-Ansatz für GOOGLE.
    Prüfe deinen Beitrag in einer RECHTSCHREIBPRÜFUNG.

    ok :) Dann kann der Thread jetzt ja geschlossen werden :D

    Viel Erfolg!
    Bitte benutze OPTION STRICT ON.
    Und optional OPTION EXPLICIT ON.
    Hier ein CODE-CONVERTER.

    Suchanfragen-Ansatz für GOOGLE.
    Prüfe deinen Beitrag in einer RECHTSCHREIBPRÜFUNG.

    @Westerwälder Suchst Du zufällig die Property RichTextBox.WordWrap :?:
    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!
    Guten Abend Rod.

    Danke für den Hinweis.
    WordWrap
    Diese Vorgabe bewirkt, dass der eingegebene Text automatisch umbrochen wird, wenn die Textbreite die Breite der Textbox überschreitet.

    Da ich ja über Copy und Paste

    VB.NET-Quellcode

    1. If Me.RichTextBox_Input.CanPaste(Me.EinfuegeFormat) Then
    2. Me.RichTextBox_Input.Paste(Me.EinfuegeFormat)
    3. Else
    4. MessageBox.Show("Die Daten können nicht eingefügt werden.", Me.MessTitel, MessageBoxButtons.OK, MessageBoxIcon.Hand)
    5. End If

    einfüge, bin ich froh über eine relativ grosse Richtextbox.
    Mit der Funktion von VaporiZed geht das recht gut.
    Gruß Markus
    Habe noch eine Frage zu der Thematik.
    Die o.a. Funktion kürzt den Linetext nach einem Leerzeichen, sprich neuem Wort.
    Wenn nun das letzte Wort im Linetext sehr lange ist, passt es nicht wirklich in den Gesamttext (ist einfach zu lange)

    In WPF taucht der Begriff
    TextBlock.IsHyphenationEnabled-Eigenschaft auf.

    Kann man sowas auch in Forms-Projekten realisieren?
    Gruß Markus
    Hallo EDR,

    Frage 1)
    Private Function SplitIntoPieces(TextLine As String) As IEnumerable(Of String)
    in Post #7
    sehe nun hier im Beitrag auch nur eine Function.

    Frage 2)
    Die Funktion für automatische Silbentrennung ermöglicht eine TextBlock auf automatisch und die Silbentrennung von Wörtern entsprechend dem aktuellen Layout-Bedingung. Dadurch kann lange Wörter in einer Zeile beginnen und in der nächsten fortgesetzt und i. d. r. eine gleichmäßigere Verteilung von Leerraum im Blocksatz zu erreichen. Wörter sind unterteilt und gemäß der Grammatikregeln für den standardmäßigen getrennt.msdn.microsoft.com/de-de/libra…ionenabled(v=vs.110).aspx

    Hintergrund des Ganzen:
    Ich kopiere Textpassagen aus dem Internet (nicht die komplette Seite) und speichere dies in einer XML-Datei (.xml).
    Nun sind diese Passage oft zu lange. Füge sie in eine Richtextbox (Clipboard) ein, wo sie dann nach der Formatierung (Textlänge) in ein DGV bzw. die Datei übernommen werden.
    Zum Lesen nutze ich ein DGV, ausdrucken kann ich sie in ein Excelblatt.

    Ergänzung und Abschluss:

    Habe mich heute nochmals mit der Themaitik beschäftigt.
    Rechtschreibprüfung und Silbentrennung ist eigentlich nur mit WPF möglich.
    Mit RichtextBoxSpellCheck geht das recht gut, jedoch fehlen mir dann die Lines zur Übernahme in eine Datatable.
    Nun habe ich das Problem wie folgt gelöst:

    VB.NET-Quellcode

    1. With Me.RichTextBox_Input
    2. .AutoWordSelection = True
    3. .RightMargin = Me.TextMaxLaenge
    4. End With

    Vielen Dank für Eure Hilfe.


    Gruß Markus

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Westerwälder“ ()