Lesen von .txt Datei und trennen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 181 Antworten in diesem Thema. Der letzte Beitrag () ist von Lightsource.

    Schmittmuthelm schrieb:

    Schau dir Post 8 von Rod an

    Wo RTG diesen Post geschrieben hat, hatte ich das System noch nicht richtig verstanden und war so vertieft eine Lösung zu finden das ich diesen Post nicht mehr als meine Anlaufstelle genommen habe da ich diesen davor ja nicht verstanden hatte.

    Nun nachdem stundenlangen googeln habe ich mir Post #8 nochmal angesehen und diesen auch verstanden.
    Habe nun alles richtig eingesetzt und das Problem scheint gelöst.

    If (ComboBox1.SelectedIndex >= Part2.Count) Then Return
    Wäre nett wenn mir das jemand erklären würde den Rest von Post #8 verstehe ich endlich.

    Was mir nun noch fehlt ist wenn ich die CheckBox abwähle das die ComboBox leer sein soll, denn mit:
    ComboBox_EQACItem.Items.Clear()
    verschwindet zwar der Text jedoch wenn man drauf klickt sind die Einträge noch vorhanden.

    mit
    TextBox_EQACCommand.Clear()
    wird auch der Text in der TextBox entfernt wenn ich die jeweilige CheckBox abwähle.

    Edit:

    VB.NET-Quellcode

    1. Private Sub ComboBox_EQACItem_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox_EQACItem.SelectedIndexChanged
    2. If (ComboBox_EQACItem.SelectedIndex >= EQACRing.Count) Then
    3. Return
    4. End If
    5. TextBox_EQACCommand.Text = "$ci " + EQACRing(ComboBox_EQACItem.SelectedIndex)
    6. If (ComboBox_EQACItem.SelectedIndex >= EQACNecklace.Count) Then
    7. Return
    8. End If
    9. TextBox_EQACCommand.Text = "$ci " + EQACNecklace(ComboBox_EQACItem.SelectedIndex)
    10. End Sub



    Habe eben herausgefunden wenn ich das so habe wird nur das erste If verwendet.
    Wähle ich z.B. die erste CheckBox ab und klicke auf eine andere CheckBox wird es richtig in die ComboBox eingelesen jedoch nach dem auswählen in der ComboBox wird nichts in die TextBox eingegeben da das zweite If irgendwie nicht abgerufen wird.

    Und noch was mein Pfad lautet ja einfach Name.txt kann ich diese Dateien auch in Ordner packen und dann Ordner/Name.txt?

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

    MrSKY schrieb:

    If (ComboBox1.SelectedIndex >= Part2.Count) Then Return
    Wäre nett wenn mir das jemand erklären würde den Rest von Post #8 verstehe ich endlich.


    VB.NET-Quellcode

    1. Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    2. If (ComboBox1.SelectedIndex >= Part2.Count) Then
    3. Return
    4. End If
    5. Label1.Text = Part2(ComboBox1.SelectedIndex)
    6. End Sub


    Hier setzt du den Text von Label1 auf den Inhalt von Part2, welcher am Index mit dem Wert ComboBox1.SelectedIndex vorhanden ist. Mit der Abfrage wird verhindert, dass du auf einen Index zugreifen willst welcher gar nicht erreichbar ist; ansonsten bekommst du in dem Fall zur Laufzeit eine Exception.


    Zu deinen anderen Fragen zum Thema CheckBox wäre es gut, wenn du einfach mal deinen Code dazu zeigst, d.h. mindestens mal das entsprechende Event, bestenfalls vielleicht sogar mal dein komplettes Projekt bereinigt hier hochladen. Sonst weiß ja niemand was du schon hast und wo der Fehler liegen könnte
    Dumm ist der, der dumm ist. Nicht andersrum!

    Schmittmuthelm schrieb:

    wenn du einfach mal deinen Code dazu zeigst, d.h. mindestens mal das entsprechende Event

    Habe ich doch bereits getan oben.
    Aber hier die zwei Events um die es geht und wo das Problem zusammen hängt.
    ReadOnly hat mir VS vorgeschlagen.

    VB.NET-Quellcode

    1. ​Private ReadOnly EQACNecklace As New List(Of String)
    2. Private Sub GunaCheckBox_EQACNecklace_CheckedChanged(sender As Object, e As EventArgs) Handles GunaCheckBox_EQACNecklace.CheckedChanged
    3. Dim lines() = System.IO.File.ReadAllLines("Necklace.txt")
    4. EQACNecklace.Clear()
    5. ComboBox_EQACItem.Items.Clear()
    6. TextBox_EQACCommand.Clear()
    7. For Each line In lines
    8. Dim parts() = line.Split(","c)
    9. ComboBox_EQACItem.Items.Add(parts(0))
    10. EQACNecklace.Add(parts(1))
    11. Next
    12. ComboBox_EQACItem.SelectedIndex = -1
    13. End Sub
    14. Private ReadOnly EQACBracelet As New List(Of String)
    15. Private Sub GunaCheckBox_EQACBracelet_CheckedChanged(sender As Object, e As EventArgs) Handles GunaCheckBox_EQACBracelet.CheckedChanged
    16. Dim lines() = System.IO.File.ReadAllLines("Bracelet.txt")
    17. EQACBracelet.Clear()
    18. ComboBox_EQACItem.Items.Clear()
    19. TextBox_EQACCommand.Clear()
    20. For Each line In lines
    21. Dim parts() = line.Split(","c)
    22. ComboBox_EQACItem.Items.Add(parts(0))
    23. EQACBracelet.Add(parts(1))
    24. Next
    25. ComboBox_EQACItem.SelectedIndex = -1
    26. End Sub
    27. Private Sub ComboBox_EQACItem_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox_EQACItem.SelectedIndexChanged
    28. If (ComboBox_EQACItem.SelectedIndex >= EQACNecklace.Count) Then
    29. Return
    30. End If
    31. TextBox_EQACCommand.Text = "$ci " + EQACNecklace(ComboBox_EQACItem.SelectedIndex)
    32. If (ComboBox_EQACItem.SelectedIndex >= EQACBracelet.Count) Then
    33. Return
    34. End If
    35. TextBox_EQACCommand.Text = "$ci " + EQACBracelet(ComboBox_EQACItem.SelectedIndex)
    36. End Sub


    Das wäre der aktuelle Code jedoch wird die zweite If Abfrage in der ComboBox mit dem SelectedIndexChanged Event nicht ausgeführt.
    Irgendwie scheint nur die erste If-Abfrage zu funktionieren.
    @MrSKY Was nützt es, wenn Du eine CheckBox auf Deiner GUI platzierst und dann nicht mal den Checked-Status abfragst?
    Dann kannst Du auch gleich einen Button nehmen.
    Was genau sollen die CheckBoxen bewirken?
    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 glaub ich versteh dein Problem noch nicht richtig. Was heißt für dich "Wird nicht ausgeführt"?
    Wenn die erste If-Abfrage true ist rufst du ja Return auf, verlässt also die Methode/das Event. Da macht der Code ja was er soll ?(

    Ansonsten einfach mal in Debuggen, Fehler finden und beseitigen vorbeischauen. Dann kannst du eventuell genauer beschreiben was du von deinem Code eigentlich erwartest, und was er wo anders macht als du dir das gedacht hast.
    Dumm ist der, der dumm ist. Nicht andersrum!

    RodFromGermany schrieb:

    Checked-Status abfragst?

    Ok gut das wusste ich nicht das ich den Status abfragen muss.
    Wie ich bereits gesagt habe ich bin neu in der Materie und versuche mich daran.
    Ich weiß ich hätte evtl mit was leichterem Anfangen können jedoch ist meine Motivation das umzusetzen viel höher.

    Schmittmuthelm schrieb:

    Da macht der Code ja was er soll

    Es gibt keine Fehler beim Debuggen alles ist richtig.
    Der einzige "Fehler" den ich bemerkt habe ist wenn ich z.B. wie hier zwei CheckBoxen habe die eine anklicke erscheint mir der erste Eintrag aus der .txt in die ComboBox eingelesen dann geht es weiter im Code je nachdem was ich in der ComboBox auswähle erhalte ich den zweiten Eintrag aus der .txt in die TextBox. Soweit so gut.
    Entferne ich das Häckchen bei der CheckBox und setz dieses auf das andere wird mir wieder der erste Eintrag aus der anderen .txt in die selbe ComboBox eingelesen jedoch erhalte ich den zweiten Eintrag aus der ersten CheckBox in die TextBox.

    Das Problem wird daran liegen das wie eben RTG gesagt hat keine Checked Abfrage vorhanden ist für die CheckBoxen oder was ich mir dachte das nur meine erste "If" Abfrage ausgeführt wird.
    Deswegen der Code.
    Ist der Code nun richtig?
    Wird die zweite If richtig ausgeführt ist dies so überhaupt möglich?

    Um den Checked Status abzufragen würde ich:
    ​If Ceckbox1.Checked Then
    machen jedoch wie soll das in den Code eingefügt werden wenn ich da schon eine If Abfrage ist

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

    MrSKY schrieb:

    Ok gut das wusste ich nicht das ich den Status abfragen muss.
    Den musst Du nur abfragen, wenn Du einen Sinn darin siehst. Im Sinne von: »Computer: Hat die Box nen Haken dran, dann mache dies, ansonsten mache das.«

    Das mit der Startabfrage

    VB.NET-Quellcode

    1. If (ComboBox_EQACItem.SelectedIndex >= EQACNecklace.Count) Then
    2. Return
    3. End If
    verstehe ich noch nicht. Wenn eine Textdatei ausgelesen wird und der erste Teil einer Zeile in die ComboBox kommt und der zweite Teile in eine List(Of String), dann wird die o.g. Bedingung niemals eintreffen. Da dann der ComboBox-SelectedIndex immer unter der angegebenen Grenze bleibt. Aber vielleicht ergäbe sich eine zu prüfende Konstellation, wenn der Code noch weiter ausgebaut ist …

    Wenn ich sehe: in der ComboBox wird A angezeigt, aber es gibt einen Eintrag B dazu, der dann immer noch im Hintergrund mitspielt, ließe sich mit DataBinding was machen. Da werden Datenpakete erstellt und dann kann man in der ComboBox ein Teil eines Pakets anzeigen lassen, aber auf Wunsch mehr herholen. Beispiel: Ich definiere ein Paket Halskette mit den Eigenschaften Material, Preis, Hersteller, Modellname und lass mir in der ComboBox nur den Modellnamen anzeigen. Aber auf Wunsch/Klick, bekomm ich alle Daten der ausgewählten Halskette. Oder eben einen Satz wie "Diese Halskette namens … kostet … €"
    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.

    VaporiZed schrieb:

    DataBinding

    Das hört sich doch echt gut an.
    Damit könnte man ja wie soll ich sagen, das Horizont erweitern?
    Jedoch habe ich davon bis dato nichts gehört/gelesen und somit brauche ich wieder 1 Woche bis ich verstehe was das bedeutet und wie man dies richtig anwendet.
    An sich läuft ja so gut wie alles was ich haben wollte.
    List(Of String) wie gut das damit ist kann ich nicht sagen da ich das nicht richtig verstanden habe.

    Und noch was mein Pfad lautet ja einfach Name.txt kann ich diese Dateien auch in Ordner packen und dann Ordner/Name.txt?

    VB.NET-Quellcode

    1. Private Sub ComboBox_EQACItem_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox_EQACItem.SelectedIndexChanged
    2. If (ComboBox_EQACItem.SelectedIndex >= EQACNecklace.Count) Then
    3. Return
    4. End If
    5. TextBox_EQACCommand.Text = "$ci " + EQACNecklace(ComboBox_EQACItem.SelectedIndex)
    6. If (ComboBox_EQACItem.SelectedIndex >= EQACBracelet.Count) Then
    7. Return
    8. End If
    9. TextBox_EQACCommand.Text = "$ci " + EQACBracelet(ComboBox_EQACItem.SelectedIndex)
    10. End Sub

    Hier machst du dir übrigens auch TextBox_EQACCommand.Text = "$ci " + EQACNecklace(ComboBox_EQACItem.SelectedIndex) wieder mit TextBox_EQACCommand.Text = "$ci " + EQACBracelet(ComboBox_EQACItem.SelectedIndex) platt, wenn keine der if-Abfragen erfüllt ist. Also konzeptionell nicht so gut, vielleicht aber auch so von dir gewollt, das weiß ich nicht.

    List(Of String) ist, wie der Name schon sagt, eine Auflistung von Strings. Dieser Liste fügst du in deiner For Each Elemente, also neue Strings hinzu, welche du später über einen Index ansprichst.
    Wenn deine List(Of String) mit Namen MeineStringListe die Elemente :
    • "Ich"
    • "bin"
    • "eine"
    • "Liste"
    besitzt, sprichst du mit MeineStringList(2) den Wert "eine" an. Wobei 2 der Index der Auflistung ist
    Dumm ist der, der dumm ist. Nicht andersrum!

    Schmittmuthelm schrieb:

    sprichst du mit MeineStringList(2) den Wert "eine" an. Wobei 2 der Index der Auflistung ist

    Also die Beschreibung ist eine 10/10 das hab sogar ich verstanden :)

    VB.NET-Quellcode

    1. If (ComboBox_EQACItem.SelectedIndex >= EQACBracelet.Count) Then
    2. Return
    3. End If
    4. TextBox_EQACCommand.Text = "$ci " + EQACBracelet(ComboBox_EQACItem.SelectedIndex)


    Es ist auf das bezogen da ich ja mehrere CheckBoxen habe und je nachdem soll mir das ausgegeben werden.
    Was ist falsch daran das wenn ich die CheckBox ändere und eine andere anklicke die ComboBox zwar die neue .txt einliest jedoch der Text in der TextBox noch der alte ist.

    CheckBox1 -> ComboBox richtiger Text -> TextBox richtiger Text -> CheckBox abwählen -> neue CheckBox anwählen -> ComboBox neuer richtiger Text -> TextBox falscher Text
    Egal was ich dann in der ComboBox anklicke ich erhalte den Text von der ersten .txt dort ausgegeben.

    Liegt der Fehler daran, dass die CheckBox keine Checked Abfrage hat?
    Oder warum passiert das?
    Wähle ich zum Beispiel direkt die zweite CheckBox an bei Programmstart -> ComboBox richtig -> TextBox richtig
    Welche CheckBox ist denn die erste und welche die zweite für dich? Also welche ist Necklace und welche Bracelet?

    Ohne zu wissen welche CheckBox welche ist...der Fehler passiert vermutlich in deinem ComboBox_EQACItem.SelectedIndexChanged-Event. Du unterscheidest hier ja, wie schon richtig erkannt, nicht, welche CheckBox grade aktiv ist. Auch hier wäre konzeptionell der Radio-Button wohl besser geeignet, da du dein Vorgehen so beschreibst, dass immer nur eine CheckBox aktiv ist.

    Ohne die Abfrage welche CheckBox checked ist, machst du dir deinen TextBox.Text immer wieder platt
    Dumm ist der, der dumm ist. Nicht andersrum!

    Schmittmuthelm schrieb:

    Wenn deine List(Of String) mit Namen MeineStringListe die Elemente :
    "Ich"
    "bin"
    "eine"
    "Liste"
    besitzt

    Und das selbe geht auch mit Ich,bin,eine,Liste? wie ich es gerade in meinem Code habe richtig?

    Schmittmuthelm schrieb:

    dass immer nur eine CheckBox aktiv ist.

    Genau richtig, es ist immer nur eine der CheckBoxen aktiv, bzw. es soll immer nur eine davon aktiv sein sonst würde ja das auslesen in die ComboBox und auch der Text in der TextBox nicht passen/falsch sein wenn zwei gleichzeitig ausgewählt sind.
    Was genau ist der Unterschied von RaidioButton und CheckBox für mich sieht beides gleich aus.
    Auf RadioButtons umzusteigen wäre jetzt kein Mega-Problem jedoch schon ein kleines da ich ca. 20 CheckBoxen habe ...
    Theoretisches Beispiel: Du liest die erste Datei mit 3 Halsketten ein. Und dann die zweite Datei mit 5 Ohrringen. Die Überprüfung sagt jetzt: Wenn Du den 4. Eintrag wählst, ist das ja "mehr" als es Halsketten gibt. Daher Abbruch. Dass die Halsketten aber keine Rolle mehr spielen, weil Du die gar nicht mehr in der ComboBox drin hast, steht noch nicht im Code.
    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.

    MrSKY schrieb:

    Und das selbe geht auch mit Ich,bin,eine,Liste? wie ich es gerade in meinem Code habe richtig?

    Die Frage versteh ich leider noch nicht ?(

    MrSKY schrieb:

    Was genau ist der Unterschied von RaidioButton und CheckBox für mich sieht beides gleich aus.


    Bei zwei CheckBoxen musst du immer händisch dafür sorgen, dass nur eine CheckBox ausgewählt ist. RadioButtons kümmern sich quasi von selbst darum, dass nur einer ausgewählt ist. (Sofern sie sich in einer "Gruppe" befinden).
    Das heißt, die lassen gar nicht zu, dass zwei RadioButtons den Status "checked" haben, was bei CheckBoxen durchaus der Fall sein kann.
    Dumm ist der, der dumm ist. Nicht andersrum!

    Schmittmuthelm schrieb:

    Die Frage versteh ich leider noch nicht

    Das war auf die Gliederung bezogen.
    Ich habe es mit Beistrichen getrennt und du hast es Untereinander geschrieben.
    Aber ich denke ich hab es verstanden, es geht auch mit Beistrichen sonst würde es ja bei mir im Code nicht funktionieren.

    Schmittmuthelm schrieb:

    (Sofern sie sich in einer "Gruppe" befinden).

    Das hört sich schon mal gut an, so gesehen würde das eigentlich mein Problem lösen richtig?
    Wie ich RadioButtons einfüge ist kein Problem jedoch wie ich diese in eine "Gruppe" hinzufüge schon.

    Edit:
    Habe mich kurz eingelesen also brauche ich eine GroupBox und dort platziere ich die RadioButtons?
    Wenn Du mehrere RadioButtons auf dem Form hast, ist das schon eine Gruppe. Mit Gruppe ist in diesem Fall die Menge an RadioButtons gemeint, die sich im selben Container befinden. Ein Container ist z.B. ein Panel, eine GroupBox oder eben Dein Form. (Es gibt auch andere Container). Wenn Du also 3 Panels auf Dein Form ziehst, kannst Du theoretisch (bzw. wenn Du willst) 4 RadioButton-Gruppen erzeugen:
    • RadioButton1-4 direkt auf dem Form
    • RadioButton5-6 auf Panel1
    • RadioButton7-10 auf Panel2
    • RadioButton11-22 auf Panel3
    Und in jeder Gruppe kannst Du dann (nur) einen RadioButton auswählen. Also 1 pro Gruppe, also insgesamt 4 Stück.
    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.

    MrSKY schrieb:

    also brauche ich eine GroupBox und dort platziere ich die RadioButtons


    Nö, wenn die einfach auf deiner Form sind, sind sie auch in einer Gruppe. Solche Sachen findest du durch probieren meistens schneller raus, als wenn du hier Fragen stellst.

    MrSKY schrieb:

    so gesehen würde das eigentlich mein Problem lösen richtig?


    Sofern du richtig abfragst welcher RadioButton grade checked ist und dann entsprechend darauf reagierst, ja.
    Du kannst das ja einfach mal versuchen anzupassen, und wenn du nicht weiter kommst zeigst du deinen Code und schilderst dein Problem
    Dumm ist der, der dumm ist. Nicht andersrum!
    Genau, die RadioButtons sollen die CheckBoxen ersetzen.
    Aus
    Private Sub GunaCheckBox_EQACBracelet_CheckedChanged(sender As Object, e As EventArgs) Handles GunaCheckBox_EQACBracelet.CheckedChanged

    wird z.B.
    Private Sub GunaRadioButton_EQACBracelet_CheckedChanged(sender As Object, e As EventArgs) Handles GunaRadioButton_EQACBracelet.CheckedChanged sofern der RadioButton GunaRadioButton_EQACBracelet heißt

    Wenn du den RadioButton auch GunaCheckBox_EQACBracelet nennst, kann das Event auch so benannt bleiben wie es ist, aber das wäre sehr verwirrend. Also immer aussagekräftige Namen für Controls verwenden (gilt für Methoden übrigens auch)
    Dumm ist der, der dumm ist. Nicht andersrum!
    RadioButtons sind die GUI-Elemente für entweder-oder. CheckBoxen für Alles-Nichts-Oder. Also Mehrfachauswahl möglich inkl. der Option gar-nichts-gewählt und alles-gewählt. Entscheide selbst, was sinnvoll ist. Oder eben, wie schon wohl von RfG angesprochen: Buttons. Also erster Button fürs Halsketten-laden, zweiter fürs Armbänder-laden. Dafür sind Buttons da: "Tu was, Computer!" Aber vielleicht gibt es ja auch einen guten Grund für Dich, keine Buttons einzusetzen. Hab ihn nur leider noch nicht erkannt.
    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.