You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Access更新窗体ListBox初始不高亮问题求助

Access窗体ListBox加载时无法高亮选中项问题

问题详情

打开Access更新窗体时,List46、List44两个ListBox控件无法高亮显示已选中的项目,但切换到设计视图再返回窗体视图后,选中项就能正常显示。尝试过重新编写查询、替换代码,甚至在DoCmd.FormOpen后立即执行关闭再打开窗体的操作,都没能解决问题;而且修改查询或代码还会导致其他功能异常。

当前Form_Load事件代码

Private Sub Form_Load()

Me.Combo58 = Me.Combo58.ItemData(0)
Me.Form.SetFocus
Dim strSQL As String
Dim result As DAO.Recordset
strSQL = "SELECT BookingHorse.[HorseiD], BookingHorse.[Bookingreference] FROM BookingHorse WHERE (((BookingHorse.[Bookingreference])=" & Combo58.ItemData(0) & "));"

Set result = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
Do While Not result.EOF
 For p = 0 To Me.List46.ListCount - 1
        If CStr(List46.ItemData(p)) = CStr(result.Fields(0).Value) Then
        List46.Selected(p) = True
    End If
    Next p
  result.MoveNext
Loop

Dim strSQL1 As String
Dim result1 As DAO.Recordset
strSQL1 = "SELECT BookingEmployee.EmployeeID FROM BookingEmployee WHERE (((BookingEmployee.BookingReference)=" & Combo58.ItemData(0) & "));"


Set result1 = CurrentDb.OpenRecordset(strSQL1, dbOpenDynaset)
Do While Not result1.EOF

For q = 0 To Me.List44.ListCount - 1
    If CStr(List44.ItemData(q)) = CStr(result1.Fields(0).Value) Then
        'MsgBox ("Match")
        List44.Selected(q) = True
    End If
    Next q
    result1.MoveNext
Loop

End Sub

可行解决方法

方法1:强制刷新ListBox后再设置选中状态

窗体加载时,ListBox的数据源可能还未完全绑定完成,添加Requery强制刷新控件数据,确保后续选中逻辑能找到对应项:

Private Sub Form_Load()

Me.Combo58 = Me.Combo58.ItemData(0)
Me.Form.SetFocus

' 先刷新两个ListBox,确保数据加载完毕
Me.List46.Requery
Me.List44.Requery

Dim strSQL As String
Dim result As DAO.Recordset
strSQL = "SELECT BookingHorse.[HorseiD], BookingHorse.[Bookingreference] FROM BookingHorse WHERE (((BookingHorse.[Bookingreference])=" & Combo58.ItemData(0) & "));"

Set result = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
Do While Not result.EOF
 For p = 0 To Me.List46.ListCount - 1
        If CStr(List46.ItemData(p)) = CStr(result.Fields(0).Value) Then
        List46.Selected(p) = True
    End If
    Next p
  result.MoveNext
Loop

Dim strSQL1 As String
Dim result1 As DAO.Recordset
strSQL1 = "SELECT BookingEmployee.EmployeeID FROM BookingEmployee WHERE (((BookingEmployee.BookingReference)=" & Combo58.ItemData(0) & "));"


Set result1 = CurrentDb.OpenRecordset(strSQL1, dbOpenDynaset)
Do While Not result1.EOF

For q = 0 To Me.List44.ListCount - 1
    If CStr(List44.ItemData(q)) = CStr(result1.Fields(0).Value) Then
        'MsgBox ("Match")
        List44.Selected(q) = True
    End If
    Next q
    result1.MoveNext
Loop

End Sub

方法2:将选中逻辑移至Form_Current事件

Form_Load触发时窗体数据可能未完全就绪,Form_Current事件在窗体数据加载完成后触发,更适合设置控件选中状态:

' 保留Form_Load的初始化操作
Private Sub Form_Load()
    Me.Combo58 = Me.Combo58.ItemData(0)
    Me.Form.SetFocus
End Sub

' 将选中逻辑移至Form_Current事件
Private Sub Form_Current()
    Dim strSQL As String
    Dim result As DAO.Recordset
    strSQL = "SELECT BookingHorse.[HorseiD], BookingHorse.[Bookingreference] FROM BookingHorse WHERE (((BookingHorse.[Bookingreference])=" & Me.Combo58.ItemData(0) & "));"

    Set result = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
    Do While Not result.EOF
     For p = 0 To Me.List46.ListCount - 1
            If CStr(List46.ItemData(p)) = CStr(result.Fields(0).Value) Then
            List46.Selected(p) = True
        End If
        Next p
      result.MoveNext
    Loop

    Dim strSQL1 As String
    Dim result1 As DAO.Recordset
    strSQL1 = "SELECT BookingEmployee.EmployeeID FROM BookingEmployee WHERE (((BookingEmployee.BookingReference)=" & Me.Combo58.ItemData(0) & "));"

    Set result1 = CurrentDb.OpenRecordset(strSQL1, dbOpenDynaset)
    Do While Not result1.EOF
     For q = 0 To Me.List44.ListCount - 1
            If CStr(List44.ItemData(q)) = CStr(result1.Fields(0).Value) Then
            List44.Selected(q) = True
        End If
        Next q
      result1.MoveNext
    Loop
End Sub

方法3:添加DoEvents等待系统完成绑定

在设置选中状态前添加DoEvents,让系统有时间完成ListBox的数据绑定:

Private Sub Form_Load()

Me.Combo58 = Me.Combo58.ItemData(0)
Me.Form.SetFocus

' 等待系统完成控件初始化
DoEvents

Dim strSQL As String
Dim result As DAO.Recordset
strSQL = "SELECT BookingHorse.[HorseiD], BookingHorse.[Bookingreference] FROM BookingHorse WHERE (((BookingHorse.[Bookingreference])=" & Combo58.ItemData(0) & "));"

Set result = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
Do While Not result.EOF
 For p = 0 To Me.List46.ListCount - 1
        If CStr(List46.ItemData(p)) = CStr(result.Fields(0).Value) Then
        List46.Selected(p) = True
    End If
    Next p
  result.MoveNext
Loop

Dim strSQL1 As String
Dim result1 As DAO.Recordset
strSQL1 = "SELECT BookingEmployee.EmployeeID FROM BookingEmployee WHERE (((BookingEmployee.BookingReference)=" & Combo58.ItemData(0) & "));"


Set result1 = CurrentDb.OpenRecordset(strSQL1, dbOpenDynaset)
Do While Not result1.EOF

For q = 0 To Me.List44.ListCount - 1
    If CStr(List44.ItemData(q)) = CStr(result1.Fields(0).Value) Then
        'MsgBox ("Match")
        List44.Selected(q) = True
    End If
    Next q
    result1.MoveNext
Loop

End Sub

内容的提问来源于stack exchange,提问作者caoimhe ni loingsigh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:54:51