列表框加载了比它应该加载的更多的数据

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:

  1. 将列表框的RowSourceType属性从"Value List"更改为"Table/Query".
  2. 确保将列表框的列数 属性 设置为 2。
  3. 在您的 LoadList() 过程中,将查询字段列表修改为 SELECT Shifts.Shift_ID, Shifts.Start_Date_Time & ' TO ' & Shifts.End_Date_Time & ' AT ' & Locations.Location_Name
  4. 最后,将更新后的查询分配给列表框的 RowSource 属性:Me.lstShifts.RowSource = strSQL