0

我有一张桌子Tbl

+----+---+---+
| ID | x | y |
+----+---+---+
|  1 | 3 | 2 |
+----+---+---+

和一个TblForm基于Tbl, 在数据表视图中的表单。

TblForm打开后,我想将列移动到 column的ID右侧x,这可以通过选择ID并向右拖动来轻松完成。但是当我在 OnLoad 事件中包含以下内容时:

Private Sub Form_Load()   
   Me.AllowDeletions = True
End Sub

然后如果我移到ID的右侧x,然后关闭并重新打开TblFormID则回到最左侧的原始位置。似乎设置AllowDeletions禁用保存列位置更改。

无论我设置AllowDeletionsTrue还是都是如此False。它也与AllowEdits和一起出现AllowAdditions

这是一个问题,因为我想根据用户的权限设置这些属性,但我不想阻止用户移动列。

4

2 回答 2

4

使用 Access 2007 和 2010,我发现 Access 不能可靠地保存用户在数据表视图中的列顺序首选项。我一直无法确定哪些设置、功能或代码会阻止保存列顺序。我今天确实对此进行了测试,并且能够复制您描述的行为,尽管有时我的列顺序被保存并重新加载(下面没有我的解决方案),而其他时候它没有保存/加载。我仍然不知道是什么导致了差异。

这是 UtterAccess 关于这个问题的一个冗长但可能有用的线程。一位屏幕名称为“mandrews”的用户说他认为这是 Access 2010 中的一个错误并提供了以下解决方案:如果您打开列表,将列移动到正确的顺序,右键单击列标题并单击取消隐藏字段,然后单击关闭并保存它应该保持顺序的表格。我最近在 Access 2013 应用程序上尝试了这个,但似乎没有用。但我今天也在 Access 2010 测试应用程序上尝试了它,它似乎确实有效。主要的不同之处在于,在隐藏或取消隐藏列之后,系统会提示您保存表单。我认为这个解决方案不是一个很好的解决方案,因为我猜它在使用 Access Runtime 时不起作用,

我自己的解决方案是在表单卸载时保存他们的设置。首先,我的函数和表旨在为每个用户在主数据库中存储用户特定的设置。当表单卸载时,我遍历所有控件并保存它们的名称和它们的 ColumnOrder 属性。然后,当表单加载时,我从数据库中检索这些设置,将它们解析出来,并将它们应用于数据表表单(通常是子表单)。我还保存了 OrderBy 以及 ColumnHidden、ColumnWidth、BackColor、AlternateBackColor、ForeColor、FontName、FontHeight、FontWeight 和 RowHeight。我知道这似乎没有必要,因为用户实际上可以保存这些修改,但我希望这些用户偏好在我发布频繁的数据库更新时保持不变。

除了两个例外,这一切都很好。第一个是排序顺序(OrderBy)似乎对它们的列顺序有一些影响。在某些情况下,它会导致我的代码无效。第二个例外是每当您从表单中删除控件时都会发生错误。在这种情况下,当我应用排序顺序 (OrderBy) 时,实际上会发生错误。如果我没记错的话,它实际上不是错误,它是关于需要输入参数值的消息。

这是获取 ColumnOrder 的代码:

Dim frm as Form
Set frm = Me.Form
Dim ctl As control
Dim ictl As Integer
Dim sValues As String

For ictl = 0 To frm.Controls.Count - 1
        Set ctl = frm.Controls(ictl)
        Select Case ctl.ControlType
            Case Access.acTextBox, Access.acComboBox, Access.acCheckBox
                sValues = sValues & ctl.Name & "=" & ctl.ColumnOrder & ":"
        End Select
Next ictl
Debug.Print Left(sValues, Len(sValues)-1)
'Save sValues to your Database somewhere for retrieval later

以下是应用 ColumnOrder 的方法:

Dim frm as Form
Set frm = Me.Form
Dim sSettings As String
Dim aryRead1() As String
Dim aryRead2() As String
Dim iCount As Integer

'You need to retrieve you're user settings somehow
'sSettings = GetSettingUser(frm.Name & "ColumnOrder")
If sSettings <> "" Then
    sSettings = sSettings & " "
    aryRead1 = Split(sSettings, ":")
    Do Until iCount = UBound(aryRead1)
        If Trim(aryRead1(iCount)) <> "" Then
            aryRead2 = Split(aryRead1(iCount), "=")
            frm.Controls(aryRead2(0)).ColumnOrder = aryRead2(1)
        End If
        iCount = iCount + 1
    Loop
End If
于 2013-07-27T15:47:41.810 回答
0

您需要做的就是为列设置“标签索引”。

于 2015-08-26T14:57:09.047 回答