此应用程序是Access 2010,带有SQL后端。
我有一个表单,它有一个标签控件,有2页。 1页有1个列表框,另一个有2个列表框。我在更改选项卡控件时使用一些代码来确定活动页面,并为活动页面上的一个(s)设置列表框行源,并在非活动页面上清除它。这需要一秒钟,而且当这种情况发生时,列表框看起来很令人讨厌。
为了防止用户看到这个,我制作了一个带有彩色背景和控制源的文本框="请稍等片刻......" 与48字体相似。在加载表单时,此文本框可见= false。单击选项卡控件后,文本框将变为可见,并且它足以覆盖整个选项卡控件。它确实覆盖了选项卡控件,但我仍然可以通过文本框看到列表框。文本框背面颜色不透明。我尝试在设计视图中右键单击列表框,然后选择“位置 - 发送到后面”,右键单击文本框并选择“位置 - 发送到前面”。
这似乎不起作用。有人熟悉这个问题吗?找个人试过这样的伎俩。
我的代码的所有功能都正常运行,为此更改选项卡控件。我在开头有这个代码:
.flexMenu-viewMore
最后:
DoCmd.Hourglass True
Me.txtPleaseWait.Visible = True
Me.Repaint
Application.Echo False
Debug.Print Me.txtPleaseWait.Visible
这有意义吗?
我应该以不同方式处理吗?
谢谢。
我发现列表框的zorder比文本框高,因此我将文本框更改为列表框。我仍然会看到标签控件中的列表框,通过我用来掩盖它们的列表框。
是否有一个控制可以更好地覆盖这些并且可能有这个"间歇"类型消息显示,而列表框正在设置和取消设置?
答案 0 :(得分:0)
我研究了这方面的不同方面,发现列表框的zorder比文本框高,后者相对于其他对象位于前面或后面。我试着只是对表单执行此操作,并且没有时间隐藏任何内容。它只是等待加载表单,直到设置了行源。
由于find选项卡是默认选项卡,并且加载速度更快,我只需在加载时加载它。然后,如果有人点击其他选项卡,我将加载添加列表框。我还在表单加载时将整数变量设置为0。当我单击选项卡转到添加页面(添加页面处于活动状态)时,我检查该变量,如果它是0,我设置行源,然后+1到变量。下次我点击它,我不会重新订购它。
这样,我没有使用资源来加载和卸载列表框,如果用户甚至转到该选项卡,我只加载其中的2个。很多时候,他们可能只是在系统中寻找一个,然后去查看它。
以下是完整代码,以防此方法帮助其他人。您也可以将变量设置为boolean,然后将其设置为true,然后设置为false。
Option Compare Database
Option Explicit
Dim AddLoaded As Integer
Property Get ActivePage() As Access.Page
'PROPERTY TO IDENTIFY WHICH TAB WE ARE ON, FOR FILTERING AND IDENTIFYING WHICH ACTIVE LISTBOX TO LOOK AT, FOR VALUES AND ACTIONS
With Me.tbAddFind
Set ActivePage = .Pages(.Value)
End With
End Property
Private Sub Form_Load()
Dim Listctrl As Control
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
Dim cSQL As String
AddLoaded = 0
For Each Listctrl In Form.Controls
If (Listctrl.ControlType = acListBox) Then
With Listctrl
.RowSource = ""
End With
End If
Next Listctrl
Me.tbAddFind.Value = 0
cSQL = "SELECT vw_CMP_Projects.CM_CID, [vw_CMP_Projects]![ProjectName] &" & Chr$(34) & " (" & Chr$(34) & "& [vw_CMP_Projects]![ProjectNo] &" & Chr$(34) & ") " & Chr$(34) & " AS Projects FROM vw_CMP_Projects ORDER BY [vw_CMP_Projects]![ProjectName] &" & Chr$(34) & " (" & Chr$(34) & "& [vw_CMP_Projects]![ProjectNo] &" & Chr$(34) & ")" & Chr$(34)
Me.lstProjects.RowSource = cSQL
Me.lstProjects.Requery
End Sub
Private Sub tbAddFind_Change()
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
Select Case Me.ActivePage.Name
Case "pgAddProjects"
If AddLoaded = 0 Then
cmd.ActiveConnection = GetCatalog()
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "sp_RefreshProjectsAdd"
cmd.Execute
Me.lstAllProjects.RowSource = "Select * From qryAddProjectsYes"
Me.lstAllProjects.Requery
Me.lstAddProjects.RowSource = "Select * From qryAddProjectsNo"
Me.lstAddProjects.Requery
AddLoaded = AddLoaded + 1
End If
End Select
End Sub
感谢您的讨论。这很有帮助,因为它给了我研究的东西。