Vb.net List.Count返回0

Vb.net List.Count返回0,vb.net,.net-3.5,generic-list,Vb.net,.net 3.5,Generic List,我正在尝试将SQL查询的结果读取到列表(的)中,在向列表添加项目时,我可以看到List.count,但在我尝试读取列表时,代码的另一部分中,List.count返回0 我的名单如下: Public Class roomList Public Sub New() End Sub Public Property eName() As String Get Return _eName End Get Se

我正在尝试将SQL查询的结果读取到列表(的)中,在向列表添加项目时,我可以看到List.count,但在我尝试读取列表时,代码的另一部分中,List.count返回0

我的名单如下:

Public Class roomList
    Public Sub New()
    End Sub

    Public Property eName() As String
        Get
            Return _eName
        End Get
        Set(ByVal value As String)
            _eName = value
        End Set
    End Property
    Public Property eID() As Integer
        Get
            Return _eID
        End Get
        Set(ByVal value As Integer)
            _eID = value
        End Set
    End Property
    Public Property eEmail() As String
        Get
            Return _eEmail
        End Get
        Set(ByVal value As String)
            _eEmail = value
        End Set
    End Property
    Private _eID As Integer
    Private _eName As String
    Private _eEmail As String
End Class
Private Sub Window1_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
        Try
            getRoomList()
            Dim rooms As New List(Of roomList)()
            Dim r As roomList
            MsgBox(rooms.Count)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
我正在将SQL结果读入列表,如下所示: 编辑:这段代码在它自己的Sub()中

然后,我尝试读取列表的计数,如下所示: 编辑:这段代码在它自己的Sub()中

有人能帮助我理解列表返回0计数的原因,并帮助我修复代码,以便正确调用列表吗

我感谢任何人能够提供的任何帮助,如果您需要任何进一步的信息,请不要犹豫与我联系

马特

编辑:我试图读取/写入列表的两段代码都在它们自己的子代码中,我应该声明一个全局变量吗

第一部分内容如下:

Public Class roomList
    Public Sub New()
    End Sub

    Public Property eName() As String
        Get
            Return _eName
        End Get
        Set(ByVal value As String)
            _eName = value
        End Set
    End Property
    Public Property eID() As Integer
        Get
            Return _eID
        End Get
        Set(ByVal value As Integer)
            _eID = value
        End Set
    End Property
    Public Property eEmail() As String
        Get
            Return _eEmail
        End Get
        Set(ByVal value As String)
            _eEmail = value
        End Set
    End Property
    Private _eID As Integer
    Private _eName As String
    Private _eEmail As String
End Class
Private Sub Window1_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
        Try
            getRoomList()
            Dim rooms As New List(Of roomList)()
            Dim r As roomList
            MsgBox(rooms.Count)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
它调用getRoomList()子对象:

那么这个片段:

Dim rooms As New List(Of roomList)()
MsgBox(rooms.Count)
将始终显示0,因为您正在创建一个新列表并声明一个名为
rooms
的单独变量

您还没有显示在哪里调用读取数据的代码(即前面的代码段)


老实说,现在还不清楚这些代码在哪里执行。如果你能提出一个简短但完整的程序来演示这个问题,那将非常有帮助。当我们只能看到代码片段时,很难对整个程序流程有一个很好的了解。

从第二个代码片段中,是什么让您认为您使用了相同的列表?您在新调暗的变量上创建了一个
New
List(Of roomList)实例。要修复此代码,我们需要知道这两个代码段是如何关联的。

一些可能性:

如果您在代码中两次声明rooms list,第二次声明将创建计数为0的新rooms列表,并基本上删除以前的列表。根据你发布的内容,这可能就是正在发生的事情

如果数据源中没有房间,则读取器可能返回0个房间

rooms变量的作用域错误。n将其作用域增加到module、class或更高级别,以便两个sub访问相同的变量,而不是两个不同的变量

此外,我会将计数移出循环。最后数一数

这是有效的:

Dim rooms As New List(Of roomList)    
While dr.Read      
rooms.Add(New roomList() With {.eID = dr.Item("mId"), .eName = dr.Item("roomName"), .eEmail = dr.Item("roomEmail")})      
MsgBox(rooms.Count)    
End While
MsgBox(rooms.Count)
消除新房间的创建:

Dim rooms As New List(Of roomList)()
MsgBox(rooms.Count)
上面的操作创建了一个新的列表对象,它实际上最初是空的

根据您的编辑

你提到

编辑:我试图读/写的两段代码 该列表在他们自己的Sub中,我是否应该声明 全局变量

由于它们位于两个不同的子例程中,一个实例丢失,因此计数现在为0,因为您创建了一个新实例。您要做的是获取初始列表并将其传递给相关的子程序/函数。如果您计划修改该列表,请将其传递给
ByRef
,否则将其传递给
ByVal
。大意如下:

'code...
 PrintListCount(rooms)
'other code...

protected Sub PrintListCount(ByVal rooms as List(Of roomList))
MsgBox(rooms.Count)
end sub
这个例子有点吓人,因为你真的不需要通过值传递整个列表来打印列表的计数……但我只是用它来告诉你如何通过列表室

每编辑一次 您的
getRoomList()
函数不返回列表。如果没有返回正确的对象,您希望如何收集计数?将sub更改为函数:

Private Function getRoomList() As List(Of roomList)        
Dim rooms As New List(Of roomList)        
Try        ' SQL Query stuff goes here                
dr = sqlCmd.ExecuteReader                
While dr.Read                    
rooms.Add(New roomList() 
With {.eID = dr.Item("mId"), .eName = dr.Item("roomName"), .eEmail = dr.Item("roomEmail")})                    
'MsgBox(rooms.Count)                
End While            
End If        
Catch ex As Exception        
End Try   
return rooms 
End Function
在加载事件中:

Dim rooms as List(Of roomList)
rooms = getRoomList();
现在您有了一个合适的rooms对象,您现在可以说:

MsgBox(rooms.Count)


您需要仔细阅读传递对象、函数如何工作以及变量范围。没有这些知识,你会让自己变得更加困难。

在while循环中,你会收到一个消息框吗?你会两次声明房间吗?您的示例代码当然有两个声明。根据您的编辑,rooms变量的作用域错误。听起来它有方法级(子函数)作用域而不是类。如果房间需要在sub之间共享,那么它的范围应该在更高的级别。@Lima,请在下面我的帖子中查看我的编辑。@Lima-当您确实需要
功能时,您正在使用
sub
。您需要在
getRoomList
中创建
rooms
对象,并将其返回给调用方法。没有它,房间就没有意义。非常感谢John,你的信息帮了我很多。我将研究如何实现列表的ByRef传递。@Lima-或者您可以简单地从getRoomList()函数返回列表,并将其分配给调用代码中的本地
room
变量。谢谢,我刚刚看到了您的进一步编辑,非常喜欢这样。我已经修改了我的代码,现在它运行得很好。非常感谢您对我的问题的帮助和耐心。你很好地解释了这个问题。@Lima-如果它解决了你的问题,没问题,请将答案标记为“已接受”。@john:你写道:“如果你计划修改该列表,请按ref传递,否则按val传递”。这句话中“修饰”是什么意思?如果您的意思是更改变量指向的列表,那么您是正确的。如果您的意思是从列表中添加和删除项目,则无需通过ByRef传递
Dim rooms as List(Of roomList)
rooms = getRoomList();