appieh4ck
appieh4ck

Reputation: 13

List.Add(var) overwrites previous items in list

Every time when you press the button, you should get a customer added to your list. But it just overrides my previous value and doesn't update the List.

This is exactly what they did in my book, but I don't know why the next variable doesn't get added to the list

Private Sub btnOpslaan_Click(sender As Object, e As EventArgs) Handles btnOpslaan.Click
    Dim klantenlijst As New List(Of Klant)
    Dim nieuwe_klant As New Klant
    Dim path As String = IO.Path.GetTempFileName()

    nieuwe_klant.Naam = txtNaam.Text
    nieuwe_klant.Straat = txtStraat.Text
    nieuwe_klant.Postcode = txtPostcode.Text
    nieuwe_klant.Gemeente = txtGemeente.Text
    nieuwe_klant.Telefoon = txtTelefoon.Text
    nieuwe_klant.Email = txtEmail.Text


    If chkHardware.Checked = True Then
        nieuwe_klant.Hardware = True
    End If
    If chkInternet.Checked = True Then
        nieuwe_klant.Internet = True
    End If
    If chkMultimedia.Checked = True Then
        nieuwe_klant.Multimedia = True

    End If
    If chkSoftware.Checked = True Then
        nieuwe_klant.Software = True
    End If
    klantenlijst.Add(nieuwe_klant)
    MsgBox(klantenlijst.Count)

End Sub

My class "Klant"

Public Class Klant
Private mNaam As String
Private mStraat As String
Private mPostcode As String
Private mGemeente As String
Private mTelefoon As String
Private mEmail As String
Private mHardware As Boolean
Private mSoftware As Boolean
Private mInternet As Boolean
Private mMultimedia As Boolean
Public Sub New()
    mHardware = False
    mInternet = False
    mSoftware = False
    mMultimedia = False
    mNaam = "Niet ingevuld"
    mStraat = "Niet ingevuld"
    mPostcode = "Niet ingevuld"
    mGemeente = "Niet ingevuld"
    mTelefoon = "Niet ingevuld"
    mEmail = "Niet ingevuld"
End Sub
Public Property Hardware() As Boolean
    Get
        Return mHardware
    End Get
    Set(ByVal value As Boolean)
        mHardware = value
    End Set
End Property
Public Property Software() As Boolean
    Get
        Return mSoftware
    End Get
    Set(ByVal value As Boolean)
        mSoftware = value
    End Set
End Property
Public Property Internet() As Boolean
    Get
        Return mInternet
    End Get
    Set(ByVal value As Boolean)
        mInternet = value
    End Set
End Property
Public Property Multimedia() As Boolean
    Get
        Return mMultimedia
    End Get
    Set(ByVal value As Boolean)
        mMultimedia = value
    End Set
End Property

Public Property Naam() As String
    Get
        Return mNaam
    End Get
    Set(ByVal value As String)
        mNaam = value
    End Set
End Property
Public Property Straat() As String
    Get
        Return mStraat
    End Get
    Set(ByVal value As String)
        mStraat = value
    End Set
End Property
Public Property Postcode() As String
    Get
        Return mPostcode
    End Get
    Set(ByVal value As String)
        mPostcode = value
    End Set
End Property
Public Property Gemeente() As String
    Get
        Return mGemeente
    End Get
    Set(ByVal value As String)
        mGemeente = value
    End Set
End Property
Public Property Telefoon() As String
    Get
        Return mTelefoon
    End Get
    Set(ByVal value As String)
        mTelefoon = value
    End Set
End Property
Public Property Email() As String
    Get
        Return mEmail
    End Get
    Set(ByVal value As String)
        mEmail = value
    End Set
End Property

End Class

Upvotes: 1

Views: 77

Answers (2)

David
David

Reputation: 218877

Every time the button is clicked, you create a new list:

Dim klantenlijst As New List(Of Klant)

And then you add exactly one item to that list:

klantenlijst.Add(nieuwe_klant)

So that list will only ever contain one item.

Instead, create a class-level list and add to that. So put this line at the class level:

Dim klantenlijst As New List(Of Klant)

Then the same list is available throughout the instance of the class. A few things to note:

  1. Without more context, it's possible that you may even be looking for a larger scope than the class. There are a variety of places you can store information, a class-level variable is simply the next higher scope from your method-level variable.
  2. If you're using ASP.NET then the lifespan of the class is very short (per request) and not persisted between requests. In that case you'd want to store your data somewhere else, possibly in session state or a database.

Upvotes: 1

Nikaoto
Nikaoto

Reputation: 319

The issue here is that on every click, you are declaring a new 'klantenlijst' and making it private. Just declare it outside of the click and you'll get the desired result:

 Dim klantenlijst As New List(Of Klant)
 Private Sub btnOpslaan_Click(sender As Object, e As EventArgs) Handles btnOpslaan.Click
    Dim nieuwe_klant As New Klant
    Dim path As String = IO.Path.GetTempFileName()

    nieuwe_klant.Naam = txtNaam.Text


    //continue your code...


    klantenlijst.Add(nieuwe_klant)
    MsgBox(klantenlijst.Count)

Upvotes: 2

Related Questions