狐表的列顺序,可以通过Datatables("xx").Save(True)的方法(技术文档见下图),暂存在本地。

但是每次发布给客户更新后,客户自己存的列顺序都被清空,又要重新调整。所以就想实现:
1. 窗口关闭时,自动保存目前的列顺序到数据库。
2. 窗口打开时,自动加载从数据库加载列顺序。
但是仅仅如此还不够,因为开发者新加的列,会加载不到。所以要加判断未显示的列,是新列还是旧的。旧的继续保持隐藏,新的就加载在表格最后。
添加一个列顺序缓存的表,记录用户的列顺序
假设登录的用户,都有一个ID和姓名,并已存入全局变量PublicUserID和PublicUserName,待会内部函数会用到,用于区分列顺序记录属于哪个用户


1)函数名字:保存列顺序
'通过Functions.Execute("保存列顺序",表名)
'功能:保存列顺序,保存隐藏列
Dim tName As String = Args(0) '例如用户管理
'1判断该用户是否有列顺序记录
Dim fr As DataRow = DataTables("列顺序缓存").SQLFind("用户ID='" & PublicUserID & "' and 表名 ='" & tName & "'")
If fr Is Nothing Then
fr = DataTables("列顺序缓存").AddNew()
fr("用户ID") = PublicUserID
fr("姓名") = PublicUserName
fr("表名") = tName
End If
'2更新列顺序
fr("列顺序") = Tables(tName).GetColVisibleWidth
fr("最近编辑时间") = PublicServerDate
'3更新隐藏列
Dim hs As String = ""
For Each c As Col In Tables(tName).Cols
If c.Visible = False Then
hs &= c.Name & ","
End If
Next
hs = hs.TrimEnd(",")
fr("隐藏列") = hs
'4保存
fr.Save2)函数名字:读取列顺序
'通过Functions.Execute("读取列顺序",表名)
'1如果该用户没记录,先使用系统默认的
'2如果有,判断是否有未显示的列
'3如果有,是隐藏的旧列就隐藏,是新列,就追加到结尾
'最终应用列顺序
Dim tName As String = Args(0) '例如用户管理
'1判断该用户是否有列顺序记录
Dim fr As DataRow = DataTables("列顺序缓存").SQLFind("用户ID='" & PublicUserID & "' and 表名 ='" & tName & "'")
If fr IsNot Nothing Then
Dim s As String = fr("列顺序") '例如: 分类1|83|分类2|83|编号|36
Dim s2 As String = fr("隐藏列") '例如:ID,版本号,创建者ID
Dim ary() As String = s.Split("|")
Dim ary2() As String = s2.Split(",")
Dim ls1 As New List(Of String) '记录的列顺序
Dim ls2 As New List(Of String) '记录的隐藏列
For i As Integer = 0 To ary.Length - 1
If i Mod 2 = 0 Then
ls1.Add(ary(i))
End If
Next
For i As Integer = 0 To ary2.Length - 1
ls2.Add(ary2(i))
Next
'2判断是新列,加到尾部
For Each dc As DataCol In DataTables(tName).DataCols
If ls1.Contains(dc.Name) = False AndAlso ls2.Contains(dc.Name) = False Then
s &= "|" & dc.Name & "|98"
End If
Next
'3应用列顺序
Tables(tName).SetColVisibleWidth(s)
End If例如你的表名是“客户档案”
窗口的AfterLoad事件添加:
If User.Type <> UserTypeEnum.Developer Then
'开发状态不需要读取列,直接项目左上角“保存按钮”就行了,读取会导致新列直接被隐藏,麻烦
Functions.Execute("读取列顺序","客户档案")
End If窗口的BeforeClose事件添加:Functions.Execute("保存列顺序","客户档案")

在表事件AfterLoadTableSetting里添加:
If User.Type <> UserTypeEnum.Developer Then
'开发状态不需要读取列,直接项目左上角“保存按钮”就行了,读取会导致新列直接被隐藏,麻烦
Functions.Execute("读取列顺序",e.Table.Name)
End If在项目事件的BeforeCloseProject里添加:
For Each t As Table In Tables
Functions.Execute("保存列顺序", t.Name)
Next