Daten in einer List(Of [Structure]) bearbeiten

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von VB_Gamer.

    Daten in einer List(Of [Structure]) bearbeiten

    Hallo,

    Ich wollte einen Passwort Saver machen, und zuerst hatte ich sehr viele Listen, die alles zumüllten.
    Dann hab ich was Cooles namens "Struktur" gesehen und mich darüber schlau gemacht.

    Ich hab mich entschieden, für die Daten eine Struktur namens "Benutzer" zu benutzen und die Benutzer in einer List (Of Benutzer) namens "Account" zu speichern.
    Nun hab ich es, dass man Neues hinzufügen und Altes löschen kann, aber man soll die Daten auch Bearbeiten können.

    Das ist mein Problem.
    Ich kann die Daten, wenn ich Sie einmal eingetragen habe, nicht mehr bearbeiten.

    Der Code:

    VB.NET-Quellcode

    1. Accounts(i).UserName = "User"


    erzeugt einen Fehler:


    "Der Ausdruck ist ein Wert und kann nicht als Ziel einer Zuweisung verwendet werden."

    Weiß irgendwer, wie man trotzdem die Einträge bearbeiten kann? Das ist nämlich unbedingt notwendig.
    Ich mache dir einige kleine ausschnitte, da es aus einem Rieseigen Projekt ist.

    VB.NET-Quellcode

    1. Structure DieUhr
    2. ' Zusätzliche
    3. Dim UhrName As String ' Name der Uhr '0
    4. Dim UhrGroesse As Integer ' Größe der Uhr '1
    5. Dim UhrPos As Point ' Position auf Bildschirm '2
    6. Public Shared AktuelleUhr As New DieUhr
    7. Private Shared Sub SetValueWithUseClock()
    8. With AktuelleUhr
    9. .UhrName = "UserStyle"
    10. .UhrGroesse = 300
    11. .UhrPos = Class_Funktionen.BildSchirmMittelPunkt(.UhrGroesse) ' MittelPunkt Bildschirm
    12. End With
    13. End Sub
    14. Private Shared Sub SetValueWithStandart()
    15. With AktuelleUhr
    16. .UhrName = "StandartUhr"
    17. .UhrGroesse = 180
    18. .UhrPos = Class_Funktionen.BildSchirmMittelPunkt(.UhrGroesse) ' MittelPunkt Bildschirm
    19. End With
    20. End Sub


    Wenn du verschiedene Daten in eine Struktur bringen willst, schreibst du es entweder fest wie im Beispiel. oder du schreibst stattdessen Variable.

    bernd
    Kann man so schreiben:

    VB.NET-Quellcode

    1. Dim user As New Benutzer 'Benutzer: Die Struktur
    2. user = ListOfBenutzer(Index)
    3. user.UserName = "hallo"
    4. ListOfBenutzer(Index) = user

    ?


    @Fire:

    Die Struktur ist:

    VB.NET-Quellcode

    1. Public Structure Benutzer
    2. Dim Titel As String
    3. Dim UserName As String
    4. Dim Passwort As String
    5. Dim Andere As String
    6. Dim Index As Integer
    7. Dim HomePage As String
    8. End Structure



    PS.: Was bedeutet eigentlich "Shared" ?
    Shared bedeutet dass man auf die Funktionen und Subs zugreifen kann ohne ein Instanzierung der Klasse, schau bei Google nacht.

    Zu deinem Problem, du hast den falschen ansatz mit dme ListOf

    VB.NET-Quellcode

    1. ' globale Deklaration
    2. Dim UserList as New List(Of Benutzer)
    3. ' beim hinzufügen eines Benutzers
    4. Dim user As New Benutzer
    5. user.Name = "Dodo"
    6. user.Passwort = "12345"
    7. user.Homepage = "http://spam.de"
    8. Userlist.Add(user)
    9. ' Auflisten der Users z.B. in einer ListBox
    10. For Each user As Benutzer in UserList
    11. Listbox1.Items.Add(user.Name)
    12. Next
    13. ' Abrufen eines Benutzer
    14. Dim user As Benutzer = Userlist(Index des Benutzers)
    15. Textbox1.Text = user.Name
    16. Textbox2.Text = user.Password
    17. Textbox3.Text = user.Homepage


    Das ist alles was du brauchst.
    ...Das hab ich doch schon.

    Das, was du gepostet hast, ist das Hinzufügen von Einträgen.
    Ich meinte aber, vorhandene Einträge bearbeiten.
    Nicht mit .add, sondern zum Beispiel nach der Form: List(i)= "Hallo"

    Nur mit z.B.: ListOfStructure(I).UserName = "blabla"
    nicht ganz
    Userlist(Index des Benutzer).Name = "Dodo neuer Name"
    wirft nen fehler
    (Fehler 1 Der Ausdruck ist ein Wert und kann nicht als Ziel einer Zuweisung verwendet werden. C:\...\project)
    mein beispiel hingegen nicht
    Hm, ich hatte so ein Problem auch schoneinmal. Allerdings sieht meine Strructure anders aus.
    Ich weis nicht, ob die "Sub New()" benötigt wird oder nicht, auf jeden Fall fahre ich damit bisher ganz gut.

    VB.NET-Quellcode

    1. Public Module Daten
    2. Public listCalItem As New List(Of Calendar.CalendarItem)()
    3. 'Enthält alle Termindaten
    4. Structure Termine
    5. Dim t_id As Integer
    6. Dim t_id_eventtyp As Integer
    7. Dim t_id_vorführung As Integer
    8. Dim t_symbol As Image
    9. Dim t_startdatum As Date
    10. Dim t_enddatum As Date
    11. Dim t_titel As String
    12. Dim t_text As String
    13. Sub New( _
    14. ByVal t_id As Integer, _
    15. ByVal t_id_eventtyp As Integer, _
    16. ByVal t_id_vorführung As Integer, _
    17. ByVal t_symbol As Image, _
    18. ByVal t_startdatum As Date, _
    19. ByVal t_enddatum As Date, _
    20. ByVal t_titel As String, _
    21. ByVal t_text As String)
    22. Me.t_id = t_id
    23. Me.t_id_eventtyp = t_id_eventtyp
    24. Me.t_id_vorführung = t_id_vorführung
    25. Me.t_symbol = t_symbol
    26. Me.t_startdatum = t_startdatum
    27. Me.t_enddatum = t_enddatum
    28. Me.t_titel = t_titel
    29. Me.t_text = t_text
    30. End Sub
    31. End Structure
    32. Public TerminDaten As New ArrayList
    33. End Module


    TerminDaten kann dann jeweils die Daten aus der Structure abrufen.

    Zum Verändern mache ich dann folgendes:

    VB.NET-Quellcode

    1. Dim tTempTermin As Termine
    2. Dim cCount As Integer = 0
    3. For Each Eintrag As Termine In TerminDaten
    4. If Eintrag.t_id = EventID Then
    5. tTempTermin = TerminDaten.Item(cCount) 'tTempTermin erhält den Wert der Structure mit dem angegebenen Index
    6. tTempTermin.t_startdatum = EventStart 'Ich verändere die Werte der Structure, aber innerhalb von tTempTermin
    7. tTempTermin.t_enddatum = EventEnde 'Ich verändere die Werte der Structure, aber innerhalb von tTempTermin
    8. TerminDaten.Item(cCount) = tTempTermin 'Hier wird der eigentlichen Structure die neuen Werte zugewiesen
    9. Exit For
    10. End If
    11. cCount += 1
    12. Next


    Vielleicht hilft Dir das ja weiter.

    Gruß
    Hajo
    Habe mich nochmal mit dem Problem beschäftigt, da ich festgestellt habe, dass mein Beispiel von Oben nur funktioniert weil die For Each Schleife durch das Exit For unterbrochen wird. Nimmt man das weg erhält man eine Fehlermeldung:

    "Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden."

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Structure myCalendarDays
    2. Dim myCoords As Point
    3. Dim myId As Integer
    4. Dim myText As Integer
    5. Dim mySelected As Boolean
    6. Sub New( _
    7. ByVal myCoords As Point, _
    8. ByVal myId As Integer, _
    9. ByVal myText As Integer, _
    10. Optional ByVal mySelected As Boolean = False)
    11. Me.myCoords = myCoords
    12. Me.myId = myId
    13. Me.myText = myText
    14. Me.mySelected = mySelected
    15. End Sub
    16. End Structure
    17. Dim myMax As Integer = myListOfCalendarDays.Count - 1
    18. Dim myTempCalendarDay As myCalendarDays
    19. For i = 0 To myMax
    20. If myMousePos.IntersectsWith(myRectangle) Then
    21. myTempCalendarDay = myListOfCalendarDays.Item(myListOfCalendarDays.Item(i).myId - 1)
    22. myTempCalendarDay.mySelected = True
    23. myListOfCalendarDays.Item(myListOfCalendarDays.Item(i).myId - 1) = myTempCalendarDay
    24. End If
    25. Next



    Arbeitsweise ist die Gleiche wie oben, allerdings werden die Einträge der Structure nicht direkt übr For Each angesprochen.

    picoflop schrieb:


    Structure ist ein WERT-Typ. Wenn man ihn in die List(of ...) packt, wird er allerdings "geboxed".
    Erklärung siehe hier:
    knowdotnet.com/articles/boxedstructures.html

    Für solche Fälle also besser ne Klasse nehmen (und Tip beherzigen: Option Strict On)
    Genau das, worauf Du in dem Link verweist mache ich.

    singu schrieb:


    Module stammt noch aus VB6 Zeiten, verwende am besten Class
    Ja, genau da komme ich her. Aber trotzdem gut zu wissen, danke!

    /Edit:
    Habe mir das mit den Klassen nochmal angeschaut. Eigentlich muss man die Structure nur als Klasse einfügen. Und über die Property Geschichte funktioniert das dann Problemlos:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class myCalendarDays
    2. Dim myText As String
    3. Sub New( _
    4. ByVal myText As String)
    5. Me.myText = myText
    6. End Sub
    7. Property Text() As String
    8. Get
    9. Return myText
    10. End Get
    11. Set(ByVal Value As String)
    12. myText = Value
    13. End Set
    14. End Property
    15. End Class
    16. Public Class Form1
    17. Private myListOfCalendarDays As List(Of myCalendarDays) = New List(Of myCalendarDays)
    18. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    19. myListOfCalendarDays.Add(New myCalendarDays("bla"))
    20. myListOfCalendarDays.Add(New myCalendarDays("muh"))
    21. myListOfCalendarDays.Add(New myCalendarDays("mäh"))
    22. For Each CalendarDay As myCalendarDays In myListOfCalendarDays
    23. If CalendarDay.Text = "bla" Then
    24. CalendarDay.Text = "blub"
    25. End If
    26. Next
    27. End Sub
    28. End Class

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

    Und diesen ganzen für alle 6 Einträge in meiner Structure :thumbdown:

    Na, wenns nicht anders geht,...

    Jedenfalls danke.

    *Edit: Es funktioniert.

    Ich hab es jetzt aber nicht mit einer Klasse gemacht, sondern mit der Struktur, und zwar so:

    VB.NET-Quellcode

    1. Dim EditUser As Benutzer = Accounts(Index) 'Der zu bearbeitende User
    2. With EditUser
    3. .Titel = txtNewTitle.Text.Trim
    4. .UserName = txtNewUser.Text.Trim
    5. .Passwort = txtNewPassword.Text.Trim
    6. .Index = I_Zone
    7. .Andere = txtNewAndere.Text.Trim
    8. .HomePage = txtHomepage.Text.Trim
    9. End With
    10. Accounts(Index) = EditUser


    Danke an alle :D

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