我在表单上有一个列表框,使用以下代码加载,只能从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子不会被多次调用,所以我不明白为什么记录多次出现在列表框中。有任何想法吗?
答案 0 :(得分:2)
每次调用LoadList()
过程时,它都会向列表框中添加行。由于列表框包含30行,尽管源记录集仅包含10行,因此LoadList()
被调用3次,或者您使用非空值列表保存表单并在每个表单中再添加10行负载。
您可以通过在执行RowSource
的循环之前清空AddItem
值列表来避免此问题...
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
属性从“值列表”更改为“表/查询”。 LoadList()
程序中,将查询字段列表修改为SELECT Shifts.Shift_ID, Shifts.Start_Date_Time & ' TO ' & Shifts.End_Date_Time & ' AT ' & Locations.Location_Name
RowSource
属性:Me.lstShifts.RowSource = strSQL