Access中点击Listbox时列表变为空白的问题求助
解决Listbox点击跳转时列表空白的问题
问题原因
执行Me.Bookmark = rst.Bookmark切换窗体记录时,Listbox的数据源会触发自动刷新,若后续有消息框弹出,会让刷新导致的空白状态持续显示,放大了体验问题。
解决方法
方法1:暂存选中项并强制恢复Listbox状态
在切换记录前后保存Listbox的选中信息,完成后强制刷新并还原选中状态:
Private Sub lstFullName_Click() Dim rst As DAO.Recordset Dim selectedID As Variant Dim selectedIndex As Integer ' 暂存当前选中的ID和索引 selectedID = Me.lstFullName.Column(1) selectedIndex = Me.lstFullName.ListIndex Set rst = Me.RecordsetClone rst.FindFirst "sdtID = " & selectedID If Not rst.NoMatch Then Me.Bookmark = rst.Bookmark ' 强制刷新Listbox并还原选中项 Me.lstFullName.Requery Me.lstFullName.ListIndex = selectedIndex End If Set rst = Nothing CheckRecordStatus End Sub
方法2:用API冻结窗口避免刷新闪烁
借助系统API暂时锁定窗口刷新,操作完成后再解除,消除空白闪烁:
' 先在模块顶部声明API(64位Access需用PtrSafe) Private Declare PtrSafe Function LockWindowUpdate Lib "user32" (ByVal hwndLock As LongPtr) As LongPtr Private Sub lstFullName_Click() Dim rst As DAO.Recordset Dim selectedID As Variant selectedID = Me.lstFullName.Column(1) ' 冻结窗口,阻止刷新 LockWindowUpdate Me.hWnd Set rst = Me.RecordsetClone rst.FindFirst "sdtID = " & selectedID If Not rst.NoMatch Then Me.Bookmark = rst.Bookmark End If Set rst = Nothing ' 解除冻结并刷新界面 LockWindowUpdate 0 Me.Repaint CheckRecordStatus End Sub
方法3:调整检查逻辑的执行时机
如果CheckRecordStatus中的消息框是主要诱因,可将其移到窗体Current事件中,避免在Listbox点击流程里弹出:
Private Sub Form_Current() ' 每次切换记录时自动检查,不打断Listbox操作 CheckRecordStatus End Sub
方法4:优化查找逻辑,依赖BoundColumn
将Listbox的BoundColumn设置为sdtID对应的列(索引1),直接用Value属性获取ID,减少列索引依赖:
Private Sub lstFullName_Click() Dim rst As DAO.Recordset Set rst = Me.RecordsetClone rst.FindFirst "sdtID = " & Me.lstFullName.Value If Not rst.NoMatch Then Me.Bookmark = rst.Bookmark End If Set rst = Nothing CheckRecordStatus End Sub
内容的提问来源于stack exchange,提问作者Mowaffak Bakkar
相关产品推荐
相关产品推荐

