textbox auslesen=> jeden 2. wert ändern=>wieder zusammenfügen

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 40 Antworten in diesem Thema. Der letzte Beitrag () ist von Gottric.

    Gottric schrieb:

    dass er mit bei z.B 100.00 mit 14 Prozent 115.00 ausgiebt
    Öhm. aus 100 wird bei 14% Aufschlag 115? Ich hoffe, dass das ein Schreibfehler war, denn sonst wird's verwirrend. Mein Code aus Post#16 ist ja schon recht kompakt. Da kann man dann natürlich auch Zeile 5 aus der Schleife rausziehen, deshalb auch der Kommentar

    VaporiZed schrieb:

    Da ließe sich bestimmt einiges machen. Frag 5 Leute und Du erhältst 8 Meinungen. Ein Anfang:

    Gottric schrieb:

    es ist ausgeschlossen dass der text den ich in die textbox lade keine leerzeichen enthält!
    Doppelte Verneinung: Es ist ausgeschlossen, dass er keine Leerzeichen enthält => Du hast immer Leerzeichen drin. Vielleicht meinst Du es auch anders. Aber im Zweifelsfall statt einer TextBox ein NumericUpDown für den Prozentsatz verwenden.

    Gottric schrieb:

    Ich muss mal überprüfen ob die Zeile in der die Werte stehen immer mit SET1 anfängt dann kann ich es vielleicht über Startswith einbauen

    VB.NET-Quellcode

    1. If Not lines(i).StartsWith("SET1") Then Continue For

    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.

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

    ja, weil er 14 prozent aufrechnen soll und das dann runden, ist richtig so!

    dafür dass nur Zahlen in der Prozentbox stehen können habe ich es so gelöst:

    VB.NET-Quellcode

    1. Select Case Asc(e.KeyChar)
    2. Case 48 To 57, 8, 32
    3. ' Zahlen, Backspace und Space zulassen
    4. Case Else
    5. ' alle anderen Eingaben unterdrücke
    6. e.Handled = True
    7. End Select


    und ja, so wie ich es geschriebne habe meine ich es. es sind immer leerzeichen in der textbox.

    danke für den tip.
    aber in der textbox wo ich ab SET1 anfangen will zu splitten sind auch Tabulatoren drin. die müssen auch drin bleiben. ne Idee?
    Ich versuch mich mal weiter daran, danke bis jetzt.

    Edit:

    VB.NET-Quellcode

    1. Dim txt = txt2
    2. Dim lines() = txt.Lines, PartsOfTheLine As String() = Nothing, PartToModify As String = Nothing ' alle Zeilen holen
    3. For i = 0 To lines.Count - 1 'for each dass er zeile für zeile durchgeht
    4. lines(i) = lines(i).Replace(vbTab, " ") ' tabulator mit Leerzeichen ersetzen
    5. If Not String.IsNullOrEmpty(lines(i).Trim) Then 'nachstehende Leerzeichen entfernen
    6. If Not lines(i).StartsWith("Set") Then Continue For 'erst da im Inhakt anfangen zu splitten wo der Text mit Set anfängt
    7. PartsOfTheLine = lines(i).Split({" "}, StringSplitOptions.RemoveEmptyEntries) 'text nach dem leerzeichen splitten und die überföüssigen entfernen
    8. PartToModify = PartsOfTheLine(3) ' zuweisen welchen splitt ich brauche
    9. Dim Wert = Replace(PartsOfTheLine(3), ".", ",") 'den wert umbenennen da mit . nicht gerechnet werden kann
    10. Dim percent As Integer = CInt(txtPercent.Text) ' die prozentzahl mit der gerechnet werden soll
    11. Dim grundwert As Integer = CInt(Wert) ' den wert welche ich brauche als integer
    12. Dim ergebnis As Integer = CInt(grundwert * (percent / 100)) ' rechnen
    13. Dim offset As Integer = ergebnis + grundwert 'rechnen
    14. Dim Ergebniswert = CType(offset, String) 'das ergebnis als string übergeben
    15. Dim betrag As Double = CDbl(Ergebniswert) ' zum runden das ergebnis in double
    16. Dim fertiggerundet = CType(10 * Math.Round(betrag / 10, 0), String) ' runden wie ich das brauche
    17. Dim mitoffset As Double = CDbl(fertiggerundet) ' die fertige rechnung als double
    18. fertiggerundet = String.Format("{0:F2}", mitoffset) ' das fertige ergebnis als string in meinem benötigeten format
    19. fertiggerundet = Replace(fertiggerundet, ",", ".") 'in dem ergebnis das , zum rechnen wieder durch einen punkt ersetzen
    20. PartsOfTheLine(3) = fertiggerundet ' mein ergebnis dem gesplitteten string zuweisen
    21. lines(i) = String.Join(" ", PartsOfTheLine) 'den rest vom string wieder mit meinem ergebnis zusammensetzen
    22. End If
    23. Next
    24. txt2.Lines = lines 'alles in die textbox übergeben
    25. txt2.Text = txt2.Text.TrimEnd + vbCrLf

    das ist der Code den ich habe bis jetzt. aber ich veränder ja die Struktur des Inhaltes. jemand ne idee wie ich die Tabulatoren drin lassen kann und an diesen Splitte(es können auch 2 Tabulatoren hintereinander gesetzt sein)?
    ich denke ich muss ne scheife laufen lassen und immer wenn mehr als 1 Tabstop drin ist replacen. aber da scheitere ich bis jett noch dran

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

    Gottric schrieb:

    VB.NET-Quellcode

    1. Dim Ergebniswert = CType(offset, String) 'das ergebnis als string übergeben
    2. Dim betrag As Double = CDbl(Ergebniswert) ' zum runden das ergebnis in double
    Was soll das?
    1. kannst Du beim Konvertieren einr Zahl deren Nachkommastellen festlegen,
    2. kannst Du einen numerischen Wert auf eine vorgebbare Anzahl von Nachkommastellen runden.
    Das, was Du da machst, ist in jedem Falle Grütze.
    Beschreib mal verbal, was mit dieser Hin- und Herkonvertierung eigentlich 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!

    Gottric schrieb:

    jemand ne idee wie ich die Tabulatoren drin lassen kann und an diesen Splitte(es können auch 2 Tabulatoren hintereinander gesetzt sein)?
    Das wäre kein Problem, Split hat eine Überladung, womit du mehrere Split-Characters übergeben und die leeren Einträge ignorieren kannst.
    msdn.microsoft.com/de-de/library/ms131448(v=vs.110).aspx

    Aber ich sehe genauso wie meine Vorredner, dass dein Grundansatz alles andere als optimal ist.
    Beginne am besten damit:

    RodFromGermany schrieb:

    Beschreib mal verbal, was mit dieser Hin- und Herkonvertierung eigentlich passieren soll.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hey, das ist wirklich mist! gibt es nichts dran zu leugnen.

    ist abgeändert soweit ich das konnte. das waren vorschläge von vb.net. da option strict on manche konvertierungen nicht zulässt.

    und die Tabstop und Leerzeichenproblematik hab ich nun wie folgt gelöst:

    VB.NET-Quellcode

    1. Dim txt = txt2
    2. Dim lines() = txt.Lines, PartsOfTheLine As String() = Nothing, PartToModify As String = Nothing
    3. For i = 0 To lines.Count - 1
    4. If Not String.IsNullOrEmpty(lines(i).Trim) Then
    5. If Not lines(i).StartsWith("Set") Then Continue For
    6. While lines(i).Contains(vbTab & vbTab)
    7. lines(i) = lines(i).Replace(vbTab & vbTab, vbTab)
    8. End While
    9. While lines(i).Contains(" ")
    10. lines(i) = lines(i).Replace(" ", " ")
    11. End While
    12. lines(i) = lines(i).Replace(vbTab, " ")
    13. PartsOfTheLine = lines(i).Split({" "}, StringSplitOptions.RemoveEmptyEntries)
    14. PartToModify = PartsOfTheLine(3)
    15. Dim Wert = Replace(PartsOfTheLine(3), ".", ",")
    16. Dim percent As Integer = CInt(txtPercent.Text)
    17. Dim grundwert As Integer = CInt(Wert)
    18. Dim ergebnis As Integer = CInt(grundwert * (percent / 100))
    19. Dim offset As Integer = ergebnis + grundwert
    20. Dim Ergebniswert = CType(offset, String)
    21. Dim betrag As String = (Ergebniswert)
    22. Dim fertiggerundet = CType(10 * Math.Round(CInt(betrag) / 10, 0), String)
    23. Dim mitoffset As String = (fertiggerundet)
    24. fertiggerundet = String.Format("{0:F2}", mitoffset)
    25. fertiggerundet = Replace(fertiggerundet, ",", ".")
    26. PartsOfTheLine(3) = fertiggerundet
    27. lines(i) = String.Join(" ", PartsOfTheLine)
    28. lines(i) = lines(i).Replace(" ", vbTab + " ")
    29. End If
    30. Next
    31. txt2.Lines = lines
    32. txt2.Text = txt2.Text.TrimEnd + vbCrLf


    wie überprüfe stelle ich denn an dass er mir erst das überprüft ob irgendwo set steht am anfang einer zeile, und wenn nicht den anderen code verwendet, also den aus post22?
    ich muss nähmlich da an unterschiedlichen stellen splitten um den richtigen wert zu veränderen.

    Gottric schrieb:

    Hey, das ist wirklich mist! gibt es nichts dran zu leugnen.
    So isses.
    Beschreib mal, ohne Code zu verwenden, was Dein Code eigentlich machen soll, das erschließt sich mir nämlich nicht.
    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!
    Hallo @RodFromGermany
    Es geht um folgendes, ich habe eine Maske auf der 6 textboxen nebeneinander 4x untereinander aufgelistet werden.Dort lade ich den Inhalt einer Textdatei rein.
    einmal sieht der Inhalt so aus:

    900 180.00 200.0 290.0 0.00 0.00
    900 0.0 0.0 0.0 0.00 0.00
    900 250.0 250.0 290.0 0.00 0.00
    900 250.0 250.0 290.0 0.00 0.00
    900 40.00 60.0 60.0 0.00 0.00
    900 40.0 60.0 60.0 0.00 0.00
    900 40.0 60.0 60.0 0.00 0.00

    Der Inhalt kann aber auch so aussehen:

    NameSet1 = default set name
    NameSet2 = default set name
    NameSet3 = default set name
    ;--------------------------------------------------------
    Code = 0
    Info = Converted from dbk_8888 to 8888.dbk
    Modify = 2016-05-15
    byUser =
    Reason = Conversion 1. rob generation to 2. generation
    LastRun = -
    Caption = Speed Flow PattAr AtomAr Rotat. Hi-Vot
    Set1 = 600 300.00 140.00 220.00 0.000 0.000
    Set2 = 600 150.00 180.00 220.00 0.000 0.000
    Set3 = 600 00.00 0.00 0.00 0.000 0.000

    nun möchte ich ein Offset auf den 2. Wert(Flow Rate) auf den Inhalt des Textfeldes geben. Ich habe ein Textfeld in dem ich die gewünschte Prozentzahl eingebe und dann soll er bitte diesen auf den Wert der Aktuellen als Wert in der Textbox ist draufrechenen und runden, dies dann ohne die anderen Werte zu verändern in die Textbox schreiben sodass ich das abspeichern kann.

    Funktioniert ja auch mit dem Code so wie ich ihn habe. aber leren ja noch, ihr habt ja gesagt dasss da fehler drin sind( bzw. unnötiges konvertieren etc.)
    hoffe das ist verständlich ausgedrückt.
    @Gottric OK.
    Meinst Du diese Werte:

    Quellcode

    1. 180.00
    2. 0.0
    3. 250.0
    4. 250.0
    5. 40.00
    6. 40.0
    7. 40.0
    ?
    Ist die 900 für alle relevanten Zeilen fix?
    Und alle nicht relevanten Zeilen sehen so aus oder sind diese (aufgelisteten)?
    Gibt es eine Trennung zwischen "gut" und "böse" oder treten die gemischt auf?
    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!
    ja genau diese werte.
    beim 2. beispiel wären es diese Werte :

    Quellcode

    1. 300.00
    2. 150.00
    3. 00.00

    wobei auf 00.00 ja nichts draufegerechent werden kann prozentual.
    ist nur ein Beispiel. Die Zahlen sind nicht fix, sind immer unterschiedlich. auch Zeilenweise unterschiedlich.
    aber es ist immer der 2. wert den ich veränderen möchte. in beiden Varianten des Inhaltes.
    Und alle nicht relevanten Zeilen sehen so aus oder sind diese (aufgelisteten)?
    was meinst du damit?

    Gottric schrieb:

    beim 2. beispiel wären es diese Werte :
    Missverständnis.
    Beim ersten Block fangen die "guten" Zeilen mit 900 an.
    Beim zweiten Block fangen die "guten" Zeilen mit Set@ = an.
    Wie noch (bitte eine vollständige Auflistung) können "gute" Zeilen anfangen?
    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!
    im ersten Block können nur Zahlen drin stehen bis zu 50 Zeilen sagen wir mal. hab zwar selbst noch nie mehr als 20 gesehen aber sagen wir mal 50.
    Die Zeilen können mit der Zahl 0 anfangen, können aber auch mit der Zahl 2000 anfangen und alle Zeilen sind relevant.

    Im 2. Block ist viel Text drin, aber ab da wo die Werte Zählen bzw. ab wo ich sie änderen möchte. Fängt es immer mit Set an, Set1, Set2 etc. soviele Sets halt in der Datei drin sind.
    In dieser Datei sind aber auch Tabstops gesehen, die ich aber rauslösche und durch leerzeichen ersetze.

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

    @Gottric Das Problem ist, dass wir alle "guten" Zeilen rausfischen müssen, die wir dann dem Split() zuführen wollen.
    Da ist es egal, ob da ein Leerzeichen oder ein Tabulator drinne steht, das wird beim Split mit aufgelistet.
    Meine Frage zielte dahin:
    Wieviele Sorten "guter" Zeilen gibt es, weil ja beim ersten Block das zweite und beim zweiten Block das vierte gesplittete Element das Zielelement ist.
    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 wir reden aneinander vorbei.
    es ist genauso wie du schon aufgeschrieben hast.
    im ersten Block ist der split beim 2. element und beim zweiten block ist es das 4. element des strings was geändert werden soll.
    die sind nicht in einer textbox. es ist entwerden variante 1 also nur zahlen drin, oder es ist variante 2 wo ab Set gesplittet werden muss drin.
    in einer textbox sind NIE varianten beide drin, meinst du das?
    ich lade also entwerde die eine oder die andere in die textbox, nie beide.

    Gottric schrieb:

    in einer textbox sind NIE varianten beide drin, meinst du das?
    Ich meine, Du solltest ausschließlich Zeilen auflisten, die einem Split() zugeführt werden könnten.
    Das heißt, irgendwo, z.B. in einer TextBox, stehen Zeilen, die nach "gut" und "schlecht" unterteilt werden, und nur die "guten" werden gesplittet und verarbeitet.
    Feddich.
    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!

    Gottric schrieb:

    in JEDER Zeile der Textbox.
    die z.B. auch so aussehen kann:

    Gottric schrieb:

    Info = Converted from dbk_8888 to 8888.dbk
    :?: :?: :?:
    Dann splitte los und gut.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim lines() = TextBox1.Lines
    3. For i = 0 To lines.Length - 1
    4. Dim line = lines(i)
    5. Dim parts() = line.Split(New Char() {" "c, CChar(vbTab)})
    6. Dim value = Double.Parse(parts(1).Replace("."c, ","c)) * 1.15
    7. parts(1) = value.ToString().Replace(","c, "."c)
    8. lines(i) = String.Join(" ", parts)
    9. Next
    10. TextBox1.Lines = lines
    11. End Sub
    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!
    vgl. Post Nr. 31
    da hab ich schon erklärt das bei variante 1 nur zahlen drin stehen, also sofort gesplittet werden kann und
    dass es bei der 2. Veriante ab dort wo die Zeile mit Set anfängt losgeht mit dem splitten, wie du selbst ja schon gesagt hast, bei der Variante dann ab dem 4. wert in einer ezile, aber erst wenn die Zeile mit set anfängt.
    Hallo, also soweit bin ich jetzt. Es mag nicht sehr schön aussehen aber funktioniert wie ich das möchte.
    Variante 1:

    VB.NET-Quellcode

    1. If ComboBoxEbenen.Text = "Ebene 1" Then
    2. Try
    3. Dim txt = txt2
    4. Dim lines() = txt.Lines, PartsOfTheLine As String() = Nothing, PartToModify As String = Nothing
    5. For i = 0 To lines.Count - 1
    6. If Not String.IsNullOrEmpty(lines(i).Trim) Then
    7. PartsOfTheLine = lines(i).Split({" "}, StringSplitOptions.RemoveEmptyEntries)
    8. PartToModify = PartsOfTheLine(1)
    9. Dim Wert = Replace(PartsOfTheLine(1), ".", ",")
    10. Dim percent As Integer = CInt(txtPercent.Text)
    11. Dim grundwert As Integer = CInt(Wert)
    12. Dim ergebnis As Integer = CInt(grundwert * (percent / 100))
    13. Dim offset As Integer = ergebnis + grundwert
    14. Dim Ergebniswert As Integer = (offset)
    15. Dim betrag As Integer = Ergebniswert
    16. Dim fertiggerundet = CType(10 * Math.Round(betrag / 10, 0), String)
    17. Dim mitoffset As Integer = CInt((fertiggerundet))
    18. fertiggerundet = String.Format("{0:F1}", mitoffset)
    19. fertiggerundet = Replace(fertiggerundet, ",", ".")
    20. PartsOfTheLine(1) = fertiggerundet
    21. lines(i) = String.Join(" ", PartsOfTheLine)
    22. End If
    23. Next
    24. txt2.Lines = lines
    25. txt2.Text = txt2.Text.TrimEnd.Replace(" ", " ")
    26. Catch ex As Exception
    27. MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler")
    28. End Try
    29. End If

    Variante 2:

    VB.NET-Quellcode

    1. If ComboBoxEbenen.Text = "Ebene 1" Then
    2. Try
    3. Dim txt = txt2
    4. Dim lines() = txt.Lines, PartsOfTheLine As String() = Nothing, PartToModify As String = Nothing
    5. For i = 0 To lines.Count - 1
    6. If Not String.IsNullOrEmpty(lines(i).Trim) Then
    7. If Not lines(i).StartsWith("Set") Then Continue For
    8. While lines(i).Contains(" ") Or lines(i).Contains(vbTab + vbTab)
    9. lines(i) = lines(i).Replace(" ", " ").Replace(vbTab, " ")
    10. End While
    11. PartsOfTheLine = lines(i).Split({" "}, StringSplitOptions.RemoveEmptyEntries)
    12. PartToModify = PartsOfTheLine(3)
    13. Dim Wert = Replace(PartsOfTheLine(3), ".", ",")
    14. Dim percent As Integer = CInt(txtPercent.Text)
    15. Dim grundwert As Integer = CInt(Wert)
    16. Dim ergebnis As Integer = CInt(grundwert * (percent / 100))
    17. Dim offset As Integer = ergebnis + grundwert
    18. Dim Ergebniswert As Integer = (offset)
    19. Dim betrag As Integer = Ergebniswert
    20. Dim fertiggerundet = CType(10 * Math.Round(betrag / 10, 0), String)
    21. Dim mitoffset As Integer = CInt((fertiggerundet))
    22. fertiggerundet = String.Format("{0:F1}", mitoffset)
    23. fertiggerundet = Replace(fertiggerundet, ",", ".")
    24. PartsOfTheLine(3) = fertiggerundet
    25. lines(i) = String.Join(" ", PartsOfTheLine)
    26. lines(i) = lines(i).Replace(" ", " ")
    27. End If
    28. Next
    29. txt2.Lines = lines
    30. txt2.Text = txt2.Text.TrimEnd
    31. Catch ex As Exception
    32. MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler")
    33. End Try
    34. End If


    Ich hab jetzt folgendes Problem, wie stelle ich es an dass er wenn Text in der Textbox Variante 2 anwendet und wenn Wenn nur Zahlen drin stehen Variante 1 anwendet?
    und lässt es sich vielleicht in Gruppen anwenden, sodass ich den Code nicht für jeder Textbox kopieren muss? ich dachte da an sowas, aber funktioniert leider nicht.

    VB.NET-Quellcode

    1. Dim textboxen() As RichTextBox = {txt1, txt2, txt3, txt4, txt5, txt6, txt7, txt8, txt9, txt10, txt11, txt12, txt13, txt14, txt15, txt16, txt17, txt18, txt19, txt20, txt21, txt22, txt23, txt24}
    2. For Each Textbox In textboxen
    3. 'änder den wert
    4. next


    vielen dank für eure hilfe.

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