List.Add(var)覆盖列表中的以前的项目

问题描述:

每次按下按钮时,都会将一位客户添加到列表中。但它只是覆盖我以前的值,并不会更新列表。List.Add(var)覆盖列表中的以前的项目

这正是他们在我的书做了,但是我不知道为什么下一个变量不添加到列表中

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 

我的班“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 

结束等级

这里的问题是,在每次点击时,您都会声明一个新的'klantenlijst'并将其设为私人。只需要声明它的点击之外,你会得到期望的结果:

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) 
+1

这样一个愚蠢的错误,而我的老师和我正在寻找一个小时。谢啦! – appieh4ck

+0

不客气! – Nikaoto

每次单击该按钮时,您创建一个新的列表

Dim klantenlijst As New List(Of Klant) 

然后你究竟添加一个项目到该列表:

klantenlijst.Add(nieuwe_klant) 

因此,该列表将只包含一个项目。

相反,创建一个类级列表并添加到该列表中。因此,请将此行放在课程级别:

Dim klantenlijst As New List(Of Klant) 

然后,在整个类的实例中都可以使用相同的列表。需要注意的一些事项:

  1. 没有更多的上下文,甚至有可能你正在寻找一个比这个类更大的范围。有很多地方可以存储信息,类级别变量只是方法级别变量的下一个较高范围。
  2. 如果您使用的是ASP.NET,那么类的生命周期非常短(每个请求),并且不会在请求之间持续存在。在这种情况下,您希望将数据存储在其他地方,可能是会话状态或数据库。