Vb.net List.Count返回0
我正在尝试将SQL查询的结果读取到列表(的)中,在向列表添加项目时,我可以看到List.count,但在我尝试读取列表时,代码的另一部分中,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
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();