狐表缓存用户的列顺序,让系统发布更新后也不会重置

发表日期: 2023-08-17

1需求说明

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

image.png


但是每次发布给客户更新后,客户自己存的列顺序都被清空,又要重新调整。所以就想实现:

1. 窗口关闭时,自动保存目前的列顺序到数据库。

2. 窗口打开时,自动加载从数据库加载列顺序

但是仅仅如此还不够,因为开发者新加的列,会加载不到。所以要加判断未显示的列,是新列还是旧的。旧的继续保持隐藏,新的就加载在表格最后。

2实现教程

2.1数据库添加表

添加一个列顺序缓存的表,记录用户的列顺序

假设登录的用户,都有一个ID和姓名,并已存入全局变量PublicUserIDPublicUserName,待会内部函数会用到,用于区分列顺序记录属于哪个用户

image.png

image.png

2.2添加2个内部函数

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

 2.3添加窗口事件

例如你的表名是“客户档案

窗口的AfterLoad事件添加:

If User.Type <> UserTypeEnum.Developer Then
    '开发状态不需要读取列,直接项目左上角“保存按钮”就行了,读取会导致新列直接被隐藏,麻烦
    Functions.Execute("读取列顺序","客户档案")
End If

窗口的BeforeClose事件添加:Functions.Execute("保存列顺序","客户档案")

image.png

 2.4如果我没有窗口,直接用表的,怎么办?

在表事件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



随便看看
商务联系QQ : 2385350359

Copyright 2016-2023 江门蓬江区华越科技公司 版权所有 | 承接软件定制开发,欢迎联系
粤ICP备19148806号-5