访问表单将文本框放在列表框前面?

Access Form Bring Text Box in Front of Listbox?

此应用程序是 Access 2010,具有 SQL 后端。

我有一个表单,它有一个选项卡控件,有 2 个页面。一页有 1 个列表框,另一页有 2 个列表框。我在更改选项卡控件时使用一些代码来确定活动页面,并为活动页面上的列表框设置行源,并在非活动页面上将其清除。这需要几秒钟的时间,并且在发生这种情况时列表框看起来很糟糕。

为了不让用户看到,我做了一个文本框,背景是彩色的,控件源码="Please Wait One Moment..." 像 48 字体。在加载表单时,此文本框可见 = false。单击选项卡控件时,文本框将变为可见,并且它足够大以覆盖整个选项卡控件。它确实覆盖了选项卡控件,但我仍然可以通过文本框看到列表框。文本框有背景颜色并且不透明。我尝试在设计视图中右键单击列表框并选择位置 - 置于底层,然后右键单击文本框并选择位置 - 置于顶层。

这似乎不起作用。有人熟悉这个问题吗?估计有人试过这样的把戏。

我的代码的主要内容都正常运行,因为这是在选项卡控件发生变化时。我在开头有这段代码:

DoCmd.Hourglass True
Me.txtPleaseWait.Visible = True
Me.Repaint
Application.Echo False
Debug.Print Me.txtPleaseWait.Visible

最后是这个:

Application.Echo True               
Me.txtPleaseWait.Visible = False    
Me.Repaint                          
Debug.Print Me.txtPleaseWait.Visible
DoCmd.Hourglass False               
Debug.Print "got to end of resting form state"

这有意义吗?

我应该以不同的方式处理吗?

谢谢。

编辑

我发现列表框的 zorder 比文本框高,所以我将文本框更改为列表框。我仍然看到选项卡控件中的列表框,通过我用来掩盖它们的列表框。

是否有一个控件可以更好地涵盖这些并且可以在设置和取消设置列表框时显示这种 "intermission" 类型的消息?

我研究了这方面的不同方面,发现列表框的 zorder 比文本框高,文本框相对于其他对象位于前面或后面。我试过只加载表单,没有时间隐藏任何​​东西。它只是等待加载表单,直到设置行源。

由于查找选项卡是默认选项卡,而且加载速度更快,所以我只是在加载时加载它。然后,如果有人单击其他选项卡,我将加载添加列表框。我还在加载表单时将整数变量设置为 0。当我点击选项卡转到添加页面(添加页面处于活动状态)时,我检查那个变量,如果它是 0,我设置行源,然后 +1 到变量。下次我点击它时,我不会重新排序。

这样,我就不会使用资源来加载和卸载列表框,如果用户转到该选项卡,我只会加载其中的 2 个。很多时候,他们可能只是在系统中寻找一个,然后去查看它。

这是完整的代码,以防此方法对其他人有所帮助。您还可以将变量设置为布尔值,并将其设置为 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

感谢讨论。这很有帮助,因为它给了我研究的东西。