Text in Multiline Textbox nach laden des String aus Settings nur eine Zeile

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

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Text in Multiline Textbox nach laden des String aus Settings nur eine Zeile

    Hallo,

    wie schon im Titel steht habe ich eine Textbox mit der Eigenschaft Mulltiline = true.
    Der Text wird im TextChanged Ereignis in die Settings gespeichert. Der Zeilenumbruch wird auch gespeichert, wenn ich jedoch den Text beim Starten wieder in die Textbox lade steht alles in einer Zeile.
    Kopiere ich den geladenen Text dann aus der Textbox in Word oder den Editor ist der Zeilenumbruch vorhanden. Nur eben in der Textbox nicht.
    Kennt jemand das Verhalten und kann mir helfen das zu beseitigen?

    Gruß
    Dirk
    Settings werden als Xml gespeichert, und vmtl. geht das nicht korrekt mit Zeilvorschüben um (Es gibt da ja diese verschiedenen Möglichkeiten-Wirrsal mit CR, LF, CRLF).

    (erster) Versuch: mach die Settings als StringCollection, und speichere Textbox.Lines.



    (Ansonsten scheint mir das nicht sehr resourcenschonend, bei jedem Tastendruck Settings abzuspeichern - womöglich sogar auf Platte.
    Puh - und wenn da mal jemand die Taste hält, und so das AutoRepeat auslöst - das sind bei mir 30 Anschläge pro Sekunde!)

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

    Hab es nun ins Textbox Leave Ergeignis gelegt. Danke für den Hinweis.

    VB.NET-Quellcode

    1. Private Sub tb_EMailSignature_Leave(sender As Object, e As EventArgs) Handles tb_EMailSignature.Leave
    2. My.Settings.SiganturfuerSMTPVersand.Clear()
    3. My.Settings.SiganturfuerSMTPVersand.AddRange(tb_EMailSignature.Lines)
    4. End Sub


    Ich lade das dann so:

    VB.NET-Quellcode

    1. Dim zeilen(My.Settings.SiganturfuerSMTPVersand.Count - 1) As String
    2. My.Settings.SiganturfuerSMTPVersand.CopyTo(zeilen, 0)
    3. tb_EMailSignature.Lines = zeilen


    Da ich die Signatur als einen String nutzen möchte mache ich noch so:

    VB.NET-Quellcode

    1. Friend Function StringCollectiontoString(coll As StringCollection) As String
    2. Dim text As String = ""
    3. For e = 0 To coll.Count - 1
    4. text = text & coll(e) & vbNewLine
    5. Next
    6. Return text.TrimEnd(vbNewLine)
    7. End Function



    Ist das in Ordnung so oder könnte ich es besser machen?
    @kinobi Ich würde mal das Befüllen der Settings nicht in das Leave-Event der TextBox, sondern in das FormClosing-Event der Form packen.
    Das Zusammensetzen des Strings mit Zeilenvorschüben geht in einem Einzeiler:

    VB.NET-Quellcode

    1. Dim text = String.Join(Environment.NewLine, coll)
    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!
    bei einer StringCollection muss man aber einen Extra-Aufwand treiben:

    VB.NET-Quellcode

    1. Dim text = String.Join(Environment.NewLine, coll.Cast(Of String))


    Ansonsten stimmt glaub nicht ganz, was kinobi erzählt.
    Zumindest bei mir ist Textbox.Text sauber persistierbar in den Settings.

    Auch Richtextbox.Text ist sauber persistierbar.
    Nur wenn man Richtextbox.Text in die Settings speichert, dann aber in eine Textbox.Text reproduziert, nur dann verschwinden Zeilvorschübe.
    Das liegt aber nicht anne Settings, sondern anne Richtextbox.
    Lösung:

    VB.NET-Quellcode

    1. Dim text = String.Join(Environment.NewLine, Richtextbox.Lines)
    Also wenn ich richtig liege.
    Vielleicht liegen die Dinge ja noch ganz anners, jdfs. die Settings sind eben doch durchaus tauglich, auch mehrzeiligen Text zu speichern.
    Doch das stimmt schon. Es handelt sich um ein und dieselbe Textbox zum speichern wie zum anzeigen. Da ist keine Richtextbox im Spiel. In anderen Forms habe ich dieses Verhalten nicht. Ich hab dann auch mal ne Textbox von einer anderen Form kopiert und die "fehlerhafte" damit ersetzt doch erreiche ich damit kein anderes Verhalten. ?(
    Der Umweg über die StringCollection funktioniert zwar, jedoch wundert es mich trotzdem arg wie das kommt.
    Da steht dann quasi "Zeile1Zeile2Zeile3" hintereinander. Zwischen den 3 Worten sind jeweils noch 2 versteckte Zeichen. Ich nehme an das sind chr(10) & chr(13).
    @kinobi Ich hab grade einen Spekulatius gegessen:
    Gib der TextBox mal die Property .Multiline = True.
    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!
    Kurzes Zwischenfunken. Ich habe bei Projekteigenschaften -> Einstellungen einen Eintrag: MeinText als String
    Ich habe diesen Code:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. TextBox1.Text = My.Settings.MeinText
    3. End Sub
    4. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    5. My.Settings.MeinText = TextBox1.Text
    6. End Sub

    Multiline-TextBox mit Zeilenumbrüchen und Text befüllt. Läuft. Sowohl das Speichern als auch Laden. Auch nach Programmneustart. So what?
    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.
    Weil das die einfachere Variante ist, erstmal zu nem funktionsfähigen Konsens zu kommen. Hätte ich jetzt mit Anbindung an die Settings angefangen, wäre es vielleicht zu einem »Funktioniert bei mir auch nicht« gekommen und wir hätten weitere 8 Posts gebraucht um festzustellen, warum das jetzt nicht klappt.
    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.

    kinobi schrieb:

    wundert es mich trotzdem arg wie das kommt
    Jo - das wundert mich auch.
    Gut - manches kriegt man eben nicht raus - immerhin hast du gesehen, dasses nur in deinem einen Projekt sich so komisch verhält.

    kinobi schrieb:

    ...Da steht dann quasi "Zeile1Zeile2Zeile3" hintereinander. Zwischen den 3 Worten sind jeweils noch 2 versteckte Zeichen. Ich nehme an das sind chr(10) & chr(13).
    Nee - ich denke, das ist nur chr(10) (oder kannst du Bildle machen? vlt. kann mans erkennen).
    Und chr(13) ist genau, was fehlt.
    Und das macht aus, dass Textbox die ZeilVorschübe nicht darstellt.
    Wie gesagt: Ich kann das reproduzieren mit einer Richtextbox, deren Text ich in eine normale Textbox verfrachte.
    Weil Richtextbox macht genau das: Stellt Zeilvorschübe nur mit chr(10) dar, und das ist dann inne Textbox Mist.

    Wie dem auch sei - probierma die vereinfachte Lösung:

    VB.NET-Quellcode

    1. Dim text = String.Join(Environment.NewLine, Textbox.Lines)
    Wenns klappt brauchst du nicht mit der StringCollection rumzuhampeln (also das Ding ist doch nervig im Vergleich mit List(Of String) - aber bei den Settings kann mans sich ja nicht aussuchen)