列表框加载了比它应该加载的更多的数据
listbox loads more data than it should
我在表单上有一个列表框,它使用以下代码加载,直接从 form_load 事件调用一次。
Private Sub LoadList()
Dim rs As DAO.Recordset
Dim db As DAO.Database
Dim strSQL As String
Dim condition As String
Set db = CurrentDb
condition = " WHERE Schedule_ID = " & ScheduleID
strSQL = "SELECT Shifts.Shift_ID, Shifts.Start_Date_Time, Shifts.End_Date_Time, Locations.Location_Name FROM Shifts, Locations " & _
"WHERE Schedule_ID = " & ScheduleID & " AND Locations.Location_ID = Shifts.Location ORDER BY Start_Date_Time"
'Set Recordset Query
Set rs = db.OpenRecordset(strSQL)
RecCount = recordCount("Shifts", condition)
Me.lblCount.Caption = "Shift Count: " & RecCount
rs.MoveFirst
For i = 0 To RecCount - 1
Me.lstShifts.AddItem rs!Shift_ID & ";" & rs!Start_Date_Time & " TO " & rs!End_Date_Time & " AT " & rs!Location_Name
rs.MoveNext
Next i
'Close Connections and Reset Variables
rs.Close
Set rs = Nothing
Set db = Nothing
listdirty = False
End Sub
数据库中只有十条记录,列表框却加载了三次数据(总共30条)。我单步执行了代码,并在 RecCount 变量上将其正确初始化为 10,并且 for 循环按预期迭代了 10 次。这个 LoadList sub 不会被多次调用,所以我不明白为什么记录会多次出现在列表框中。有任何想法吗?
每次调用 LoadList()
过程时,它都会向列表框中添加行。由于列表框包含 30 行,尽管源记录集仅包含 10 行,因此 LoadList()
被调用 3 次,或者您使用非空值列表保存表单并在每个 [=27= 处再添加 10 行]表单加载。
您可以通过在执行 AddItem
...
的循环之前清空 RowSource
值列表来避免该问题
rs.MoveFirst
Me.lstShifts.RowSource = vbNullString ' make sure value list starts empty
For i = 0 To RecCount - 1
Me.lstShifts.AddItem rs!Shift_ID & ";" & rs!Start_Date_Time & " TO " & rs!End_Date_Time & " AT " & rs!Location_Name
rs.MoveNext
Next i
但是您有一个几乎是您希望列表框显示的查询。修改该查询并将其用作列表框应该更简单 RowSource
:
- 将列表框的
RowSourceType
属性从"Value List"更改为"Table/Query".
- 确保将列表框的列数 属性 设置为 2。
- 在您的
LoadList()
过程中,将查询字段列表修改为 SELECT Shifts.Shift_ID, Shifts.Start_Date_Time & ' TO ' & Shifts.End_Date_Time & ' AT ' & Locations.Location_Name
- 最后,将更新后的查询分配给列表框的
RowSource
属性:Me.lstShifts.RowSource = strSQL
我在表单上有一个列表框,它使用以下代码加载,直接从 form_load 事件调用一次。
Private Sub LoadList()
Dim rs As DAO.Recordset
Dim db As DAO.Database
Dim strSQL As String
Dim condition As String
Set db = CurrentDb
condition = " WHERE Schedule_ID = " & ScheduleID
strSQL = "SELECT Shifts.Shift_ID, Shifts.Start_Date_Time, Shifts.End_Date_Time, Locations.Location_Name FROM Shifts, Locations " & _
"WHERE Schedule_ID = " & ScheduleID & " AND Locations.Location_ID = Shifts.Location ORDER BY Start_Date_Time"
'Set Recordset Query
Set rs = db.OpenRecordset(strSQL)
RecCount = recordCount("Shifts", condition)
Me.lblCount.Caption = "Shift Count: " & RecCount
rs.MoveFirst
For i = 0 To RecCount - 1
Me.lstShifts.AddItem rs!Shift_ID & ";" & rs!Start_Date_Time & " TO " & rs!End_Date_Time & " AT " & rs!Location_Name
rs.MoveNext
Next i
'Close Connections and Reset Variables
rs.Close
Set rs = Nothing
Set db = Nothing
listdirty = False
End Sub
数据库中只有十条记录,列表框却加载了三次数据(总共30条)。我单步执行了代码,并在 RecCount 变量上将其正确初始化为 10,并且 for 循环按预期迭代了 10 次。这个 LoadList sub 不会被多次调用,所以我不明白为什么记录会多次出现在列表框中。有任何想法吗?
每次调用 LoadList()
过程时,它都会向列表框中添加行。由于列表框包含 30 行,尽管源记录集仅包含 10 行,因此 LoadList()
被调用 3 次,或者您使用非空值列表保存表单并在每个 [=27= 处再添加 10 行]表单加载。
您可以通过在执行 AddItem
...
RowSource
值列表来避免该问题
rs.MoveFirst
Me.lstShifts.RowSource = vbNullString ' make sure value list starts empty
For i = 0 To RecCount - 1
Me.lstShifts.AddItem rs!Shift_ID & ";" & rs!Start_Date_Time & " TO " & rs!End_Date_Time & " AT " & rs!Location_Name
rs.MoveNext
Next i
但是您有一个几乎是您希望列表框显示的查询。修改该查询并将其用作列表框应该更简单 RowSource
:
- 将列表框的
RowSourceType
属性从"Value List"更改为"Table/Query". - 确保将列表框的列数 属性 设置为 2。
- 在您的
LoadList()
过程中,将查询字段列表修改为SELECT Shifts.Shift_ID, Shifts.Start_Date_Time & ' TO ' & Shifts.End_Date_Time & ' AT ' & Locations.Location_Name
- 最后,将更新后的查询分配给列表框的
RowSource
属性:Me.lstShifts.RowSource = strSQL