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
相关产品推荐
相关产品推荐

