狐表的列顺序,可以通过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.Save
2)函数名字:读取列顺序
'通过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