使用 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