Text Datei bis zu einem bestimmten Zeichen in Listbox einlesen

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von MisterRieus.

    So. Dann wären wir eigentlich schon bei OOP - objektorientierter Programmierung. Zumindest den ersten Schritt dahin.

    VB.NET-Quellcode

    1. Public Class Player
    2. Public Property Name As String
    3. Public Property KeeperSkillValue As Integer
    4. Public Property InnerDefenseSkillValue As Integer
    5. '...
    6. End Class
    7. '...
    8. Dim Players As New List(Of Player)
    9. For Each Line In IO.File.ReadAllLines("Spielerdatenbank.txt")
    10. Dim PlayerData = Line.Split("|"c)
    11. Dim NewPlayer = New Player
    12. NewPlayer.Name = PlayerData(0)
    13. NewPlayer.KeeperSkillValue = Integer.Parse(PlayerData(1))
    14. NewPlayer.InnerDefenseSkillValue = Integer.Parse(PlayerData(2))
    15. '...
    16. Players.Add(New Player)
    17. Next
    18. 'und später z.B. zum Suchen eines Spielernamens:
    19. Dim SelectedPlayer = Players.First(Function(x) x.Name = ListBox2.SelectedItem.ToString)
    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 Da würde ich sogar das Aufdröseln der jeweiligen Zeile in die Klasse in die Klasse Player verlagern.
    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!
    Soweit verstehe ich deinen Code und macht für mich auch Sinn, aber die letzte Zeile mit dem Suchen irgendwie nicht.
    Wenn in der Listbox2 G.Wakabayashi angeklickt ist und man drückt auf den Torwart Button dann soll ja Spielername G.Wakabayashi werden und Spielerstärke dann 1. Wert nach dem Namen.
    Mehr ist es ja nicht wirklich.
    Danke nochmal für deine/eure Hilfe!
    Das war ja auch nur der Code, um den Anfang zu haben, wie das dann mit Klassen funktioniert. Sobald Du dann den ausgewählten Spieler hast, musst Du mit dem natürlich auch was machen. In dem Fall eben z.B.:

    VB.NET-Quellcode

    1. Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. TextBox1.text = SelectedPlayer.KeeperSkillValue.ToString
    3. End Sub
    4. Public Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    5. TextBox2.text = SelectedPlayer.InnerDefenseSkillValue.ToString
    6. End Sub
    usw. Aber auch da zeigt sich: 1. CE-Benennung sollte sinnvoll sein, sonst heißt es: »Ehm ... welchen Spielerwert muss ich jetzt hier zuordnen?«, 2. Die Beschriftung/Füllung einer TextBox ist zwar zur Anzeige ganz nett. Aber was dann später mit den Werten gemacht wird, sollte nicht aufgrund der TextBox-Texte geschehen, sondern aufgrund der Klasseninstanzauswahl, das heißt der Spielerwerte. D.h. Du solltest dann mit SelectedPlayer weiterarbeiten. Oder was immer auch Dein Code noch so alles macht.

    @RodFromGermany: Ich würd den Import/Export sogar in ne komplett eigene Klasse verlagern. Ich weiß, hab zuviel »Clean Code« und so gelesen. Aber das ist ja dann ein Ding für später. Ich glaub der TE hat erstmal ganz andere Hürden zu nehmen.
    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.
    Ja verstehe werde defeinitiv als nächstes alle Button und so benennen!
    Nur ein Problem. Es kommt folgende Fehlermeldung bei dieser Zeile: Dim SelectedPlayer = Players.First(Function(x) x.Name = ListBox2.SelectedItem.ToString)
    Die Sequenz enthält kein übereinstimmendes Element.
    Jemand einen Tipp für mich?
    Habe auch wieder richtig Lust zu programmieren bekommen von daher kann man mir ein Buch empfehlen?
    Bzgl. der Fehlermeldung: Tja, kommt drauf an, ob schon Player in der Liste sind, ob da der Spieler mit dem passenden Namen dabei ist und was in der ListBox2 steht. Du könntest vor der genannten Codezeile testweise schreiben:

    VB.NET-Quellcode

    1. MessageBox.Show("->" & ListBox2.SelectedItem.ToString & "<-; Anzahl der in der Liste befindlichen Spieler: " & Players.Count.ToString)
    Das mit dem ->, <- mach ich gerne um auszuschließen, dass da versehentlich irgendwelche Leerzeichen oder andere Whitspaces drin sind, die den Vergleich stören.

    Buch: schau mal hier rein, da verlinkt der Autor selbst.
    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.
    Keine Ahnung, was mTextBox23 ist oder wie der ganze Code aussieht. Kannst ja, wenn Du willst, das Projekt bereinigt (außerdem ohne bin-, obj-, .vs- und .git-Ordner) und gezippt über [+Erweiterte Antwort] hochladen. Vielleicht finden wir so das Problem und eine Lösung.
    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.
    Textbox23 ist jetzt StärkeSpieler1

    Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim Players As New List(Of Player)
    3. For Each Line In IO.File.ReadAllLines("Spielerdatenbank.txt")
    4. Dim PlayerData = Line.Split("|"c)
    5. Dim NewPlayer = New Player
    6. NewPlayer.Name = PlayerData(0)
    7. NewPlayer.TWSkillValue = Integer.Parse(PlayerData(1))
    8. NewPlayer.IVSkillValue = Integer.Parse(PlayerData(2))
    9. Players.Add(New Player)
    10. Next
    11. MessageBox.Show("->" & ListBox2.SelectedItem.ToString & "<-; Anzahl der in der Liste befindlichen Spieler: " & Players.Count.ToString)
    12. Dim SelectedPlayer = Players.First(Function(x) x.Name = ListBox2.SelectedItem.ToString)
    13. StärkeSpieler1.Text = SelectedPlayer.TWSkillValue.ToString
    Laaangsam. Die PlayerList muss außerhalb der Button1_Click-Sub deklariert und geladen werden. Sonst wird die ja immer wieder geladen und ist nur innerhalb von Button1_Click verfügbar. das ist nicht Sinn der Sache. Außerdem kann dann die Änderung der ListBox2-Auswahl nicht sinnvoll klappen.
    Also:

    VB.NET-Quellcode

    1. Public Class Form
    2. Private Players As New List(Of Player)
    3. Public Sub Form1_Load() Handles MyBase.Load
    4. 'hier der Datei-Ladecode, um die Liste zu befüllen
    5. End Sub
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. MessageBox.Show("->" & ListBox2.SelectedItem.ToString & "<-; Anzahl der in der Liste befindlichen Spieler: " & Players.Count.ToString)
    8. Dim SelectedPlayer = Players.First(Function(x) x.Name = ListBox2.SelectedItem.ToString)
    9. StärkeSpieler1.Text = SelectedPlayer.TWSkillValue.ToString
    10. End Sub
    11. End Class
    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.
    Hatte ich auch schon probiert kommt aber selbe Fehlermeldung.

    Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form1
    4. Dim Players As New List(Of Player)
    5. Public Class Player
    6. Public Property Name As String
    7. Public Property TWSkillValue As Integer
    8. Public Property IVSkillValue As Integer
    9. Public Property AVSkillValue As Integer
    10. Public Property DMSkillValue As Integer
    11. Public Property OMSkillValue As Integer
    12. Public Property ASSkillValue As Integer
    13. Public Property MSSkillValue As Integer
    14. End Class
    15. Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
    16. If Team1Formation.SelectedItem.ToString = "3-4-3" Then
    17. PositionSpieler2.Text = "IV"
    18. PositionSpieler3.Text = "IV"
    19. PositionSpieler4.Text = "IV"
    20. PositionSpieler5.Text = "DM"
    21. PositionSpieler6.Text = "DM"
    22. PositionSpieler7.Text = "OM"
    23. PositionSpieler8.Text = "OM"
    24. PositionSpieler9.Text = "AS"
    25. PositionSpieler10.Text = "AS"
    26. PositionSpieler11.Text = "MS"
    27. End If
    28. End Sub
    29. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PositionSpieler1.Click
    30. MessageBox.Show("->" & Suchergebnis.SelectedItem.ToString & "<-; Anzahl der in der Liste befindlichen Spieler: " & Players.Count.ToString)
    31. Dim SelectedPlayer = Players.First(Function(x) x.Name = Suchergebnis.SelectedItem.ToString)
    32. StärkeSpieler1.Text = SelectedPlayer.TWSkillValue.ToString
    33. End Sub
    34. Private Sub TextBox13_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Spielersuche.TextChanged
    35. Suchergebnis.Items.Clear()
    36. ListeFuellen(Spielersuche.Text)
    37. If Spielersuche.Text = "" Then
    38. Suchergebnis.Items.Clear()
    39. End If
    40. End Sub
    41. ' Routine die die ComboBox fuellt.
    42. Private Sub ListeFuellen(ByVal SearchPattern As String)
    43. For Each founEintrag As String In Spielerdatenbank.Items
    44. If founEintrag.Contains(Spielersuche.Text) Then
    45. Suchergebnis.Items.Add(founEintrag)
    46. End If
    47. Next
    48. End Sub
    49. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    50. For Each Line In IO.File.ReadAllLines("Spielerdatenbank.txt")
    51. Dim PlayerData = Line.Split("|"c)
    52. Dim NewPlayer = New Player
    53. NewPlayer.Name = PlayerData(0)
    54. NewPlayer.TWSkillValue = Integer.Parse(PlayerData(1))
    55. NewPlayer.IVSkillValue = Integer.Parse(PlayerData(2))
    56. NewPlayer.AVSkillValue = Integer.Parse(PlayerData(3))
    57. NewPlayer.DMSkillValue = Integer.Parse(PlayerData(4))
    58. NewPlayer.OMSkillValue = Integer.Parse(PlayerData(5))
    59. NewPlayer.MSSkillValue = Integer.Parse(PlayerData(6))
    60. NewPlayer.ASSkillValue = Integer.Parse(PlayerData(7))
    61. Players.Add(New Player)
    62. Next
    63. PositionSpieler1.Text = "TW"
    64. PositionSpieler2.Text = "IV"
    65. PositionSpieler3.Text = "IV"
    66. PositionSpieler4.Text = "IV"
    67. PositionSpieler5.Text = "DM"
    68. PositionSpieler6.Text = "DM"
    69. PositionSpieler7.Text = "OM"
    70. PositionSpieler8.Text = "OM"
    71. PositionSpieler9.Text = "AS"
    72. PositionSpieler10.Text = "AS"
    73. PositionSpieler11.Text = "MS"
    74. Dim zeilen = IO.File.ReadLines("Spielerdatenbank.txt")
    75. For Each row In zeilen
    76. Spielerdatenbank.Items.Add(row.Split("|"c).First())
    77. Next
    78. End Sub
    79. End Class

    Hier mal der gesamte Code
    Grmpfl. Es wäre leichter für uns gewesen, wenn Du das Projekt hochgeladen hättest. So musste ich erstmal die Spielerdatei erstellen und die ganzen CEs. Nun ja, sei's drum.
    Der Fehler kommt von mir. Post#21, Zeile#17
    Bei Dir: Z#70
    Das muss heißén: Players.Add(NewPlayer), nicht Players.Add(New Player). Denn ansonsten wird ein neues Playerobjekt ohne zugeordnete Werte hinzugefügt. Und die Playerinstanz, die man davor mit Werten belegt hat (Z#61-69), verschwindet im Jenseits.
    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.