Schleifen Problem

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von BiedermannS.

    Schleifen Problem

    Hi, ich habe ein Problem,

    ich habe eine Klassen "Nachrichten", in der von mir IDs und Strings (Betreff und Absender) vergeben werden.

    Ich habe eine Listbox, wo Absender & ": " & betreff aufgelistet sind.

    Ich speichere die Nachrichten alledings anhand der ID in einer einfachen Textdatei (ist so gewollt).

    Wenn ich diese jetzt auslese, finde ich leider keinen Weg, die Daten abzugleichen.

    Ich lese alle Zeilen der Textdatei aus und packe sie in eine list of integer.
    Danach gehe ich diese Liste in einer Schleife durch und gehe dann die Klasse durch und suche die ID:

    VB.NET-Quellcode

    1. Dim liste As New List(Of Integer)
    2. Do
    3. sLine = oStream.ReadLine
    4. If sLine = Nothing Then Exit Do
    5. liste.Add(sLine)
    6. Loop
    7. For i As Integer = 0 To liste.Count - 1
    8. For Each nach As Nachricht In Nachrichten
    9. If nach.ID = liste(i) Then
    10. LbNachrichten.Items.Add(nach.Absender & ": " & nach.Betreff)
    11. End If
    12. Next
    13. Next


    Ich bin ein wenig überarbeitet und sehe vielleicht meinen Fehler nicht? Ich habe übrigens am obigen Code einiges ausprobiert. Ich bin mir nichtmal sicher, ob das überhaupt funktioniert.

    Liebe Grüße

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

    Ein sehr seltsames Datenmodell, das du da hast.
    Du speicherst nur die IDs in eine txt? Wo werden dann die Nachrichten gespeichert?
    Typisiertes Dataset und binäre Serialization kann ich dir auch empfehlen (wie rotherford schon gesagt hat)
    Folgende Zeile ist Schwachsinn:

    VB.NET-Quellcode

    1. If sLine = Nothing Then Exit Do

    Soll da auf Dateiende geprüft werden???
    Schau dir mal File.ReadAllLines

    Außerdem mach mal bitte Option Strict On (siehe meine Signatur) und korrigier alle angezeigten Fehler (string to integer usw).
    Hi, danke für die Nachrichten erstmal.

    Es ist strict on und ich habe keine Fehler.

    ja, das sline ist quatsch, ads weiß ich auch, aber das bringt mir zur Zeit keine Probleme, darum geht es auch nicht.

    die Nachrichten sind im Programm gespeichert, nur die IDs nicht.

    Ich möchte, dass man die Datei von überall aus mitnehmen kann, also die ID gleich bleibt, aber ich notfalls die Nachricht ändern kann.

    Könntet ihr mir einen guten Link zu euren Vorschlägen nennen?
    Bitte beantworte meine Frage: Wie speicherst du die Nachrichten?
    Es ist strict on und ich habe keine Fehler.

    Nein, hast du nicht.

    VB.NET-Quellcode

    1. liste.Add(sLine)
    konvertiert implizit string zu integer. (vorrausgesetzt sLine ist ein String, ansonsten ist der Fehler 2 Zeilen drüber)
    Du schreibst:
    Ich möchte, dass man die Datei von überall aus mitnehmen kann, also die ID gleich bleibt, aber ich notfalls die Nachricht ändern kann.

    Außerdem benutzt du eine txt zum Speichern der IDs. Aus diesen beiden Sachen schließe ich, dass du die Nachrichten auch nach einem Programmneustart wieder vorhanden sein sollen.
    Also nochmal: Speicherst du die Nachrichten auf der Festplatte? Nach dem Beenden des Programmes sind sie sonst weg.

    Die Lösungen wurden übrigens im ersten Antwortpost schon erwähnt.
    Hier ein gutes Tutorial zu Datasets (ganz unten)
    Meine Güte,

    VB.NET-Quellcode

    1. Private Sub NachrichtenLaden(ByVal lbnachrichten As ListBox)
    2. Dim oStream As IO.StreamReader
    3. Dim sLine As Integer
    4. Dim nachrichtendatei As String = Application.StartupPath & "\messages.txt"
    5. Dim nachrichten As New List(Of Nachricht)
    6. If IO.File.Exists(nachrichtendatei) Then
    7. oStream = New IO.StreamReader(nachrichtendatei)
    8. Dim listee As New List(Of Integer)
    9. Do
    10. sLine = CInt(oStream.ReadLine)
    11. If sLine = Nothing Then Exit Do
    12. listee.Add(sLine)
    13. Loop
    14. For i As Integer = 0 To listee.Count - 1
    15. For Each nach As Nachricht In nachrichten
    16. If nach.ID = listee(i) Then
    17. MsgBox("JA")
    18. lbnachrichten.Items.Add(nach.Absender & ": " & nach.Betreff)
    19. End If
    20. Next
    21. Next
    22. oStream.Close()
    23. End If
    24. End Sub


    Das ist der aktuelel Code, ich hoffe, dass damit das OFFTOPIC-Thema damit vom Tisch ist!

    Ich speichere die IDs, die der Benutzer bereits erhalten hat.

    Also die Nachrichten, die er schon bekommen hat und ja, sie sollen wieder da sein.
    Abgesehen davon, dass es nicht Offtopic ist, hast du leider immer noch nicht die Frage beantwortet, woher die Daten für die Variable nachrichten nach einem Programmstart kommen.
    Ich frage nicht nach der .txt mit den ID's sondern nach dem Inhalt der Nachrichten.
    Nachrichten hinzufügen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub Msgesadd()
    2. Nachrichten.Add(New Nachricht("Absender", "Betreff", "Text", ID, GelesenoderNicht (boolean)))
    3. end sub



    Bei FormLoad:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Msgesadd()


    Speichern:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub MsgesSave(ByVal LbNachrichten As ListBox, ByVal Nachrichtendatei As String)
    2. Dim ostream As IO.StreamWriter = New IO.StreamWriter(Nachrichtendatei)
    3. For i As Integer = 0 To LbNachrichten.Items.Count - 1
    4. For Each nach As Nachricht In Nachrichten
    5. If LbNachrichten.Items(i).ToString.Contains(nach.Betreff) And LbNachrichten.Items(i).ToString.Contains(nach.Absender) Then
    6. ostream.WriteLine(nach.ID)
    7. End If
    8. Next
    9. Next
    10. ostream.Close()
    11. End Sub



    Laden habe ich ja bereits gepostet.

    Ich hoffe das konnte helfen?
    Ich habe das Gefühl, dass du auf dem Holzweg bist. Das ist übrigens das, was rotherford in seinem ersten Post dir zu verstehen geben wollte.
    Beschreibe doch mal die Aufgabe deines Programmes.
    z.B.
    Ist es eine Art Chatprogramm oder Email Programm?
    Wo kommen die Daten für deine "Nachrichten"? (Usereingabe, email, httpwebrequest, festplatte, ...)
    Wie werden die Daten angezeigt... (z.B. Datagridview)
    Wie werden die Daten intern gespeichert? z.B.:
    -Dataset (ermöglicht praktische Datenbindung an Control)
    -Klassen (scheint dein jetziges System zu sein)
    Wie werden Daten gespeichert, um nach dem Neustart des Programmes verfügbar zu sein?
    Hier mal ein Beispiel zur Serialisierung:

    Datenklassen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. <Serializable()>
    2. Public Class Messages
    3. Inherits Dictionary(Of Integer, List(Of Message))
    4. Protected Sub New(ByVal info As Runtime.Serialization.SerializationInfo, ByVal context As Runtime.Serialization.StreamingContext)
    5. MyBase.New(info, context)
    6. End Sub
    7. Sub New()
    8. End Sub
    9. Public Property ID As Integer = 0
    10. Sub AddMessage(ByVal ID As Integer, ByVal Sender As String, ByVal Subject As String, ByVal Text As String, Optional ByVal IsRead As Boolean = False)
    11. If Not MyBase.ContainsKey(ID) Then
    12. MyBase.Add(ID, {New Message With {.Sender = Sender, .Subject = Subject, .Text = Text, .IsRead = IsRead}}.ToList)
    13. Else
    14. MyBase.Item(ID).Add(New Message With {.Sender = Sender, .Subject = Subject, .Text = Text, .IsRead = IsRead})
    15. End If
    16. End Sub
    17. End Class
    18. <Serializable()>
    19. Public Class Message
    20. Private _Sender As String = String.Empty
    21. Public Property Sender As String
    22. Get
    23. Return _Sender
    24. End Get
    25. Set(value As String)
    26. _Sender = value
    27. End Set
    28. End Property
    29. Private _Subject As String = String.Empty
    30. Public Property Subject As String
    31. Get
    32. Return _Subject
    33. End Get
    34. Set(value As String)
    35. _Subject = value
    36. End Set
    37. End Property
    38. Private _Text As String = String.Empty
    39. Public Property Text As String
    40. Get
    41. Return _Text
    42. End Get
    43. Set(value As String)
    44. _Text = value
    45. End Set
    46. End Property
    47. Private _IsRead As Boolean = False
    48. Public Property IsRead As Boolean
    49. Get
    50. Return _IsRead
    51. End Get
    52. Set(value As Boolean)
    53. _IsRead = value
    54. End Set
    55. End Property
    56. End Class


    Laden und Speichern:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Sub Speichern(ByVal pfad As String, ByVal obj As Messages)
    2. Using fs As New IO.FileStream(pfad, IO.FileMode.Create, IO.FileAccess.Write, IO.FileShare.None)
    3. Dim formatter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    4. formatter.Serialize(fs, obj)
    5. End Using
    6. End Sub
    7. Function Laden(ByVal pfad As String) As Messages
    8. Dim obj As Messages
    9. Using fs As New IO.FileStream(pfad, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None)
    10. Dim formatter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    11. obj = DirectCast(formatter.Deserialize(fs), Messages)
    12. End Using
    13. Return obj
    14. End Function


    Testprogramm (Konsolenanwendung):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private NachrichtenListe As New Messages
    2. Sub printAll()
    3. For Each ID As Integer In NachrichtenListe.Keys
    4. For Each m As Message In NachrichtenListe(ID)
    5. MsgBox("Betreff: " & m.Subject & vbCrLf &
    6. "Nachricht:" & vbCrLf & m.Text, MsgBoxStyle.OkOnly, "Absender: " & m.Sender)
    7. Next
    8. Next
    9. End Sub
    10. Sub Main()
    11. Dim currentID As Integer = 15
    12. NachrichtenListe.AddMessage(currentID, "VB-PARADISE.DE", "Datenstrukturen", "Man sollte immer richtige Datenstrukturen verwenden!", False)
    13. NachrichtenListe.AddMessage(currentID, "VB-PARADISE.DE", "Datenstrukturen2", "Serialisierung ist was schönes :)", False)
    14. currentID = 26
    15. NachrichtenListe.AddMessage(currentID, "lol@rofl.xD", "Test", "Das ist eine Testnachricht!", False)
    16. printAll()
    17. Speichern("c:\test.xml", NachrichtenListe)
    18. NachrichtenListe.Clear()
    19. printAll()
    20. NachrichtenListe = Laden("c:\test.xml")
    21. printAll()
    22. End Sub


    Wichtig: Serialisierung eignet sich nicht für große Datenmengen. Daher wäre es ratsam, schon mal auf Datenbanken hinzuarbeiten.
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    Michilol schrieb:

    Ich speichere die Nachrichten alledings anhand der ID in einer einfachen Textdatei (ist so gewollt).
    Ähm - Welcher Depp will denn sowas?
    Kann man mit ihm reden? - vlt. isser ja garkein Depp.

    Dann kannman noch vertreten, dass eine Xml-Datei natürlich auch eine TextDatei ist.

    Wenns alles nix hilft, muß man halt einen Konverter schreiben, der diese DAtei in ein typisiertes Dataset einliest, und das Dataset auch in dieses komische Format zurückspeichern kann.
    Dass wenigstens intern eine vernünftige Datenstruktur besteht.

    Aber scheint mir nicht sinnvoll, mit was annerem als typDataset hier rumzuwerkeln.
    Übringens, Serialisierung scheidet aus, sobald in der Datenstruktur m:n - Relationen auftauchen.
    Also wenns da Nachricht-Adressen und Nachrichten gibt, und jede Nachricht ist sowohl mit einer Sender-Addresse, als auch mit einer Empfänger-Addresse verknüpft, dann ist sone Struktur per Serialisierung nicht mehr persistierbar.
    Weil Serialisierung würde hier dazu führen, dass derselbe Address-DAtensatz mehrmals abgespeichert würde.
    Also im Grunde das Problem, was auch in die relationale GrundIdee anfangs kurz angerissen wird.

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

    Ich kann EDR nur zustimmen. m:n Relationen kann man nicht gut darstellen und wenn man es irgendwie schafft, ist es der selbe Schrott wie mit Textdateien herum zu werkeln.

    Also Dataset ansehen :)
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D