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.

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

    Hallo,

    Ich möchte gerne den Inhalt einer Textbox auslesen, den 2. Wert in jeder zeile verändern, den abgeänderten Wert einfügen ohne dass die restlichen werte in der Textbox davon beeinfusst werden.

    Wie ich den 2.Wert auslese aus der Textbox habe ich schon herausgefunden.

    VB.NET-Quellcode

    1. Dim Lines() As String = txt2.Text.Split(Environment.NewLine.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
    2. For Each line In Lines
    3. Dim parts() As String = line.Split({" "}, StringSplitOptions.RemoveEmptyEntries)
    4. MsgBox(parts(1).ToString)
    5. Next
    6. 'MsgBox("fertig gelesen")


    aber wie kann ich jetze auf diesen Wert eine gewisse Prozentzahl aufrechen und dann mit geändertem Wert wieder in die Textbox einfügen?

    Das Grundshema zum aufrechnen des Prozentwertes habe ich auch schon herausgefunden.

    VB.NET-Quellcode

    1. Private Function offsetgeben(txt As String) As String
    2. Dim Wert = Replace(txtGrundwert.Text, ".", ",")
    3. Dim percent As Integer = CInt(txtPercent.Text)
    4. Dim grundwert As Integer = CInt(Wert)
    5. Dim ergebnis As Integer = CInt(grundwert * (percent / 100))
    6. Dim offset As Integer = ergebnis + grundwert
    7. Dim Ergebniswert = CType(offset, String)
    8. Dim betrag As Double = CDbl(Ergebniswert)
    9. Dim fertiggerundet = CType(10 * Math.Round(betrag / 10, 0), String)
    10. Dim mitoffset As Double = CDbl(fertiggerundet)
    11. fertiggerundet = String.Format("{0:F2}", mitoffset)
    12. fertiggerundet = Replace(fertiggerundet, ",", ".")
    13. Return fertiggerundet
    14. End Function


    Aber wie gesagt, nur das Grundshema und ich weis auch nicht wie ich diese funktion anwenden kann auf den wert den ich herausgesplittet habe. da in dieser funktion jader wert noch

    VB.NET-Quellcode

    1. txtGrundwert.Text, ".", ","
    ist.
    wäre froh ihr könntet mir helfen.
    danke im vorraus

    Gottric schrieb:

    Ich möchte gerne den Inhalt einer Textbox auslesen
    Wie Du hier mit dem Inhalt der Textbox arbeitest setzt voraus, dass dieser Inhalt einer bestimmten Form / Anordnung genügt.
    Wie sieht die denn aus?
    Poste mehrere Möglichkeiten.
    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!
    auf der Maske auf der ich verschiedene Datenbanken einlade gibt es 6 Textboxen in einer Reihe und das ganze 4 Reihen untereinander.
    und jeweils 4 von einer Reihe sieht die Datenbank so aus:

    1000 0.0 200.0 200.0 0.00 0.00
    1000 0.0 200.0 200.0 0.00 0.00
    1200 100.0 100.0 200.0 0.00 0.00
    1600 0.0 120.0 220.0 0.00 0.00
    1200 300.0 120.0 220.0 0.00 0.00
    1200 250.0 160.0 250.0 0.00 0.00
    1500 0.0 200.0 230.0 0.00 0.00
    1200 100.0 100.0 200.0 0.00 0.00

    leerezeichenabstand kann unterschiedlich wein. aber das ist die Struktur und es befinden sich auch nur Zahlen darin.

    in 2 von den textboxn in einer Reihe sieht die Datenbank die ich dort reinlade aber so aus:

    NameSet1 = default set name
    NameSet2 = default set name
    NameSet3 = default set name
    NameSet4 = default set name
    NameSet5 = default set name
    NameSet6 = default set name
    NameSet7 = default set name
    NameSet8 = default set name
    NameSet9 = default set name
    NameSet10 = default set name
    NameSet11 = default set name
    ;--------------------------------------------------------
    Code = 0
    Info = Converted from dbk_7259 to 7259.dbk
    Modify = 2016-05-08
    byUser =
    Reason = Conversion 1. rob generation to 2. generation
    LastRun = -
    Caption = Brush speed Flow rate Pattern air Rotations High voltage
    Set1 = 1250 270.0 200.0 250.0 0.00 0.00
    Set2 = 1200 220.0 180.0 250.0 0.00 0.00
    Set3 = 1200 220.0 180.0 220.0 0.00 0.00
    Set4 = 1200 220.0 180.0 220.0 0.00 0.00
    Set5 = 1250 270.0 200.0 250.0 0.00 0.00
    Set6 = 1200 160.0 180.0 250.0 0.00 0.00
    Set7 = 1200 370.0 170.0 250.0 0.00 0.00
    Set8 = 1300 480.0 150.0 210.0 0.00 0.00
    Set9 = 1200 320.0 180.0 250.0 0.00 0.00
    Set10 = 1200 260.0 180.0 220.0 0.00 0.00
    Set11 = 1200 210.0 180.0 220.0 0.00 0.00

    Dort steht Text mit in der Datenbank und leerzeichenanzahl kann auch hier unterschiedlich sein.
    @Gottric Probieren wir mal:

    VB.NET-Quellcode

    1. Dim lines() = TextBox1.Lines ' alle Zeilen holen
    2. Dim parts() = lines(2).Split(" "c) ' die 3. Zeile aufdröseln
    3. parts(3) = "bla" ' deren 4. Element manipulieren
    4. lines(2) = String.Join(" ", parts) ' die 3. Zeile ersetzen
    5. TextBox1.Lines = lines ' Text zurück in die TextBox

    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!
    hey, also das ersetzt schonmal die Zeile die ich angebe, super.
    aber wie ersetzte ich in allen Zeilen der Datenbank den 2. wert?

    VB.NET-Quellcode

    1. Dim lines() = txt2.Lines ' alle Zeilen holen
    2. Dim parts() = lines(1).Split(" "c) ' die 2. Zeile aufdröseln
    3. parts(1) = "bla" ' deren 2. Element manipulieren
    4. lines(1) = String.Join(" ", parts) ' die 2. Zeile ersetzen
    5. txt2.Lines = lines ' Text zurück in die TextBox


    und was halt auch wichtig ist dass ich darauf etwas aufrechenen will.
    mache ich das am besten mit einer funktion? sowie ich sie geschreiben habe? und wenn ja wie muss ich sie denn abänderen dass sich diese nur auf den 2. wert in jeder zeile der Textbox bezieht?
    @Gottric Mach ne Schleife über die Zeilen 2, 3, 4.
    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!
    Dachte ich mir. Wenn ich gleich zuhause bin versuche ich mich dran. Danke. Geht die schleife dann über alle Zeilen hinweg automatisch? Also wenn 2 Zeilen drin stehen über 2 und wenn 13 Zeilen drin stehen über 13? Und wie muss ich denn meine Funktion abändern dass sie auf den bestimmten Part greift?

    hab das versucht, aber klappt nicht wie ich das will.

    kann mir jemand sagen wie ich so eine schleife aufbaue?
    mit for each denke ich mal.
    wäre nett könnte sich einer erbarmen und mir weiterhelfen...

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

    Gottric schrieb:

    und jeweils 4 von einer Reihe sieht die Datenbank so aus:
    Den Inhalt des Satzes kapier ich nicht. Sollte es wichtig sein, um Dein Problem zu lösen, bitte mal so formulieren, dass klar wird, was Du damit meinst.

    Gottric schrieb:

    in 2 von den textboxn in einer Reihe sieht die Datenbank die ich dort reinlade aber so aus:
    Was sind Textboxen in einer Reihe?
    Argh. Ich glaub ich versteh das ganze Szenario nicht. Was Du wo reinlädst, was Deine Datenbank (oder doch Datei?) enthält, was wo in welcher Form angezeigt wird.

    Gottric schrieb:

    hab das versucht, aber klappt nicht wie ich das will.
    Sondern? Was kommt raus und was hast Du erwartet?

    Zu Post#7:

    Gottric schrieb:

    Geht die schleife dann über alle Zeilen hinweg automatisch?
    Wenn man den Code modifiziert, schon. Dazu müsste man natürlich erstmal wissen, wo man mit der Datenverarbeitung anfangen kann. Solltest Du das schon gelöst haben und in einer TextBox (oder besser noch in einer Variable bereits alle zu modifizierenden Datenzeilen haben, dann kannst Du doch mit Deinem Code aus Post#5 arbeiten, Zeile#2-#4, so wie RFG schrieb. Und mit dem Rechnen: Wenn Deine Funktion offsetgeben aus Post#1 läuft, dann fütter sie mit dem 2. Wert einer jeden Datenzeile und pack den sich so ergebenden Wert zurück in die TextBox:

    VB.NET-Quellcode

    1. Dim lines() = txt2.Lines, PartsOfTheLine As String() = Nothing, PartToModify As String = Nothing ' alle Zeilen holen
    2. For i = 0 To lines.Count - 1
    3. PartsOfTheLine = lines(i).Split(" "c)
    4. PartToModify = PartsOfTheLine(1) '2. Wert der aktuellen Zeile
    5. PartsOfTheLine(1) = offsetgeben(PartToModify)
    6. lines(i) = String.Join(" ", PartsOfTheLine)
    7. Next
    8. txt2.Lines = lines ' Text zurück in die TextBox

    Das Übertragen von den TextBoxen in die Datenbank/Datei zurück musst Du selber bewerkstelligen. Aber wenn Du importieren kannst, kannst Du auch exportieren.
    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.
    Hallo, erstmal danke für die Antwort @VaporiZed, ich war unterwegs und komme erst jetzt dazu dir zu antworten.
    Um es mal zu verdeutlichen was ich mit der Maske und bildern meine hier ein Screenshot davon im Anhang.
    Was ich reinlade sind Datenbankne. aber in einer Textdatei hinterlegt. also ich lade keine Daten aus einer Datenbank sonder aus verschiedenen Textdateien ein.

    Dein Code funkioniert, danke. aber leider nur bei ganzen Zahlen, nicht mit z.B. 100.00 als Wert und wenn keine Zeilenumbrüche mehr hinter dem Text kommen. also zum Beispiel. Roboter 4.1 macht er es "richtig" bei dem ersten wert in jeder Zeile. beim 2. Wert, der der eigentlich verarbeitet werden soll steigt der code aus.

    Quellcode

    1. Ein Ausnahmefehler des Typs "System.IndexOutOfRangeException" ist in Roboter.exe aufgetreten.

    desweiteren habe ich natürlich das problem dass aus meiner funktion natürlich der wert aus der Textbox in der Grundwert steht genommen wird, soll ja aber nicht. es soll später nur noch das textfeld Prozent und der Button 1 auf der Maske sein. die anderen habe ich nur gebraucht um mir herzuleiten wie das ganze überhaupt rechnen kann. das funktioniert auch super. Wie bekomme ich denn in die Funktion den 2. Wert aus der Textbox rein anstatt dass ich ihn wie hier selbst eintrage?
    Und bei dem Inhalt im Textfeld von Roboter 4.5 und 4.6 funktioniert das ja natürlich auch nicht.
    Ist das vielleicht zu schwer für nen Anfänger wie mich?
    Bilder
    • scrennshot.png

      109,33 kB, 1.910×993, 139 mal angesehen

    Gottric schrieb:

    steigt der code aus.
    Sieh Dir doch einfach mal die Indizes an, da wo einer wohl einfach 1 zu groß ist.
    Poste mal die ganze Schleife und markiere die Zeile, in der der Fehler auftritt.
    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!
    wenn ich
    PartsOfTheLine(1)
    auf 0 abändere nimmt er mir ja den ersten wert, deswegen dachte ich dass es womöglich daran liegt dass zeilenumbrüche hinter dem text verantwortlich daffür sind. hab diese schon versucht zu entfernen aber mit .replace geht das irgendwie nicht.
    Bilder
    • Unbenannt.PNG

      94,29 kB, 1.223×638, 134 mal angesehen
    @Gottric Ich schätze mal, dass in dieser line(i) kein Leerzeichen mehr drinne ist oder dass gar die Zeile nur da ist, weil das Dokument mit einem NewLine endet.
    Mach mal da folgenden Test rein:

    VB.NET-Quellcode

    1. If Not String.IsNullOrEmpty(lines(i).Trim) Then
    2. ' hier der Schleifeninhalt
    3. End If
    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 Du solltest versuchen zu verstehen, was in den Posts gemeint ist.
    Kopiere nicht irgend welchen Code bei Dir rein, von dem Du nicht ansatzweise verstehst, was er macht.
    Und wenn Du Code posten sollst, poste bitte Code und kein Foto vom Code.
    Den Code kann man nämlich kopieren und editieren. Den Code von Bildern abzuschreiben macht keinen Spaß.
    Klar, dass Dein Programm diesen Ausdruck
    "800 100,0 120,0 220,0 0,00 0,"
    nicht in einen Integer konvertieren kann.
    Da solltest Du zunächst ein Split am Leerzeichen durchführen.
    Das ist nämlich in dieser Version flöten gegangen. ;(
    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 zusammen,

    also über die funktion ging es leider nicht. aber nicht schlimm, hab es jetzt im Code eingebaut und das funktioniert soweit ich es jetzt getestet habe.
    danke an euch.

    hier der Code falls nochmal jemand so ein Problem haben sollte:

    VB.NET-Quellcode

    1. Dim lines() = txt2.Lines, PartsOfTheLine As String() = Nothing, PartToModify As String = Nothing
    2. For i = 0 To lines.Count - 1
    3. If Not String.IsNullOrEmpty(lines(i).Trim) Then
    4. PartsOfTheLine = lines(i).Split({" "}, StringSplitOptions.RemoveEmptyEntries)
    5. PartToModify = PartsOfTheLine(1)
    6. Dim Wert = Replace(PartsOfTheLine(1), ".", ",")
    7. Dim percent As Integer = CInt(txtPercent.Text)
    8. Dim grundwert As Integer = CInt(Wert)
    9. Dim ergebnis As Integer = CInt(grundwert * (percent / 100))
    10. Dim offset As Integer = ergebnis + grundwert
    11. Dim Ergebniswert = CType(offset, String)
    12. Dim betrag As Double = CDbl(Ergebniswert)
    13. Dim fertiggerundet = CType(10 * Math.Round(betrag / 10, 0), String)
    14. Dim mitoffset As Double = CDbl(fertiggerundet)
    15. fertiggerundet = String.Format("{0:F1}", mitoffset)
    16. fertiggerundet = Replace(fertiggerundet, ",", ".")
    17. PartsOfTheLine(1) = fertiggerundet
    18. lines(i) = String.Join(" ", PartsOfTheLine)
    19. End If
    20. Next
    21. txt2.Lines = lines


    falls ihr noch anmerkungen habt zu dem Code bin ich offen für vorschläge.

    Den andern Text den ich in die Textboxen lade(siehe vorherige Posts) kann ich leider nicht abändern. bin auch absolut überfragt wie ich das anstellen sollte. 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. sonst fällt mir keine möglichkeit ein. aber schonmal danke für die Hilfe bei dem Code hier.
    Erstmal zu Deinem 2. Teil. Wie RFG schon schrieb: 800 100,0 120,0 220,0 0,00 0, ist nun mal keine Ganzzahl. Und was Du da als Grundwert hernimmst, musst Du selber festlegen. Wieder mit Split. Also. Was davon ist für Dich Dein Grundwert? Wohl doch der 2., richtig? Und zur Extraktion hast Du doch schon den Code:

    VB.NET-Quellcode

    1. Dim Wert = Replace(PartsOfTheLine(1), ".", ",")
    2. Dim Grundwert = Integer.Parse(Wert)


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

    VB.NET-Quellcode

    1. For Each line in txt2.Lines
    2. If String.IsNullOrEmpty(line.Trim) Then Continue For
    3. Dim PartsOfTheLine = line.Split(" "c, StringSplitOptions.RemoveEmptyEntries)
    4. Dim Grundwert = Integer.Parse(PartsOfTheLine(1).Replace(".", ","))
    5. Dim Prozentsatz = Integer.Parse(txtPercent.Text) 'warum percent, wenn fast alle anderen Variablennamen deutsch sind? Am besten alles einheitlich machen.
    6. Dim Prozentwert = CInt(Grundwert * (Prozentsatz / 100))
    7. Dim Endwert = Prozentwert + Grundwert
    8. PartsOfTheLine(1) = String.Format("{0:F1}", Endwert).Replace(",", ".")
    9. lines(i) = String.Join(" ", PartsOfTheLine)
    10. Next
    11. txt2.Lines = lines
    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 5 mal editiert, zuletzt von „VaporiZed“ ()

    @Gottric Was ist denn das für ein Ranz Code? (Sorry)
    Mach Dir bite mal die Mühe und schreibe zu jeder Zeile einen kleinen Kommentar.
    Vielleicht fällt Dir dabei auf, was da für merkwürdig Zeug steht.
    Und
    Beschreib mal kurz, was der ganze Code ühaupt anstellen 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!
    ja, ist sehr zusammengewürfelt.
    ich hab mir wie gewollt mal die mühe gemacht.

    VB.NET-Quellcode

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


    und was der code machen soll ich ja aus dem eingeangspost zu entnehmen und denke ich durch die kommentierung auch erkenntlich jetzt.
    das geht sicher einfacher, nur dieser code funktioniert ohne Probleme.
    also soll ich ihn umschreiben weil er nciht schön aussieht oder hat das auch funktionelle gründe?

    Gottric schrieb:

    VB.NET-Quellcode

    1. 'die prozentzahl mit der gerechnet werden soll
    Ändert die sich bei jedem Wert der Schleife?
    Was passiert, wenn im zu splittenden Text kein Leerzeichen enthalten ist?
    Mit einer guten Formatanweisung kannst Du eine beliebige Anzahl von Nachkommastellen ausgeben, da brauchst Du kein Math.Round().
    Und wenn Du Dir einen anglo Formatprovider erstellst, musst Du nicht permanent zwischen Kommas und Punkten jonglieren.
    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!
    nein, der prozentwert soll auf jeden werten in der schleife angewand werde.
    es ist ausgeschlossen dass der text den ich in die textbox lade keine leerzeichen enthält!
    ich will es genauso runden, nicht auf kommastellen sondern dass er mit bei z.B 100.00 mit 14 Prozent 115.00 ausgiebt. so ist es genau richtig für meine anwendung.
    einen formatprovider habe ich versuch zu erstellen, hast die in meinem letzten Tehma schonmal erwähnt. bin aber kläglich gescheitert und meine Priorität steht momentan auf der funktionalität. sobald das alles funktioniert bemühme ich mich es einfacher zu schreiben. aber danke.

    jetzt muss ich erstmal schauen wie ich .startswith in diesen code einbaue dass er mir für den anderen text den ich reinlade (vgl. vorhergegangene post) erst ab da die zeilen ändert.
    jemand ne idee? weil da ja nicht nur zahlen drin stehen.