Foxtable(狐表)用户栏目专家坐堂 → [分享]表及窗口表列宽调整自定义列宽列宽保存设置保存列顺序调整列顺序保存设置


  共有1614人关注过本帖树形打印复制链接

主题:[分享]表及窗口表列宽调整自定义列宽列宽保存设置保存列顺序调整列顺序保存设置

帅哥哟,离线,有人找我吗?
xiangwei_zeng
  1楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:83 积分:1381 威望:0 精华:0 注册:2013/11/28 19:45:00
[分享]表及窗口表列宽调整自定义列宽列宽保存设置保存列顺序调整列顺序保存设置  发帖心情 Post By:2024/6/15 8:16:00 [只看该作者]

方便有需要的人搜索,所以标题显得很怪异,用过搜索的人可能能理解

列宽调整这个功能看了很多帖子,没有一个能很完全的举例直接拿给新手使用或者给更多的解释,我在其中指导帮忙最大的一个帖子基础上做了修改完善并重新整理,可能更适用低阶的用户。
过程中花费了很多时间,因为非专业的,所以水平有限,学得慢,不断测试才弄懂使用,也是第一次学习使用函数。

学习的来源帖如下:

图片点击可在新窗口打开查看此主题相关图片如下:来源帖.png
图片点击可在新窗口打开查看

优化后好处如下:
1、拖动列宽和调整列顺序后,根据不同用户分别保存设置,项目打开后是新设置好的顺序

2、列宽表数据无初始值,默认按初始值打开,只要拖动列宽或列顺序就会保存数据供下次调用

3、加载和隐藏表防止未加载表或意外修改表,导致不能正常使用。

4、初始和使用中都不需要单独登记列宽表数据,窗口表也一样适用,简单粗暴


实现过程优化后如下:
一、建一个表保存列宽设置后的数据(实际使用中发现窗口名称和窗口表名这两列实际不需要使用,但是这是后发现的,所以也不改图片了)
建好表什么也不用管,初始和使用中不需要录入数据。

图片点击可在新窗口打开查看此主题相关图片如下:列宽表.png
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:列宽表结构.png
图片点击可在新窗口打开查看

二、建立函数来保存和获取表的列宽数据
原以为表界面和窗口界面的设置不一样,我分别设置函数,实际上测试保存和获取各一个函数即可,表是统一设置,窗口表是每个窗口都要单独设置,因为没有全局窗口事件

1、表保存列宽
Dim un As String = args(0) '窗口用户 关键:第一次用函数来设置表的列宽
Dim zb As String = args(1) '数据主表
Dim r As DataRow = DataTables("窗口表列宽").Find("用户名='" & un & "' And 数据表名= '" & zb & "'")
If r IsNot Nothing Then
    r("列配置") = Tables(zb).GetColVisibleWidth()
Else
    r = DataTables("窗口表列宽").AddNew
    r("用户名") = User.Name 
    r("数据表名") = CurrentTable.Name
    r("列配置") = Tables(zb).GetColVisibleWidth()
End If
DataTables("窗口表列宽").Save
'Return Nothing    学习的原版中有,不了解实际意义,测试的差别是,有此代码,表加载但不加载数据时,不会保存列宽改动值,去掉代码则会保存

2、表获取列宽
Dim un As String = args(0) '表当前使用用户名
Dim zb As String = args(1) '数据表名
Dim cvs As String  '表本身的默认值
Dim r As DataRow = DataTables("窗口表列宽").Find("用户名='" & un & "' And 数据表名= '" & zb & "'")
If r IsNot Nothing Then
    If r.IsNull("列配置") = False Then
        Return r("列配置")
    Else
        cvs = Tables(zb).GetColVisibleWidth()
        Return cvs
    End If
Else
    cvs = Tables(zb).GetColVisibleWidth()
    Return cvs                        '关键:之前不了解函数也没仔细看,所以这个返回值折腾了很久,一直未写对导致一直报错
End If

图片点击可在新窗口打开查看此主题相关图片如下:表列宽设置内部函数.png
图片点击可在新窗口打开查看

三、全局表事件,经此设置,所有表都可以使用,包括关联表
1、项目事件:Initialize

For Each dt As DataTable In DataTables

    dt.GlobalHandler.AfterDragColumn = True

    dt.GlobalHandler.AfterResizeColumn = True   

Next


图片点击可在新窗口打开查看此主题相关图片如下:项目代码1.png
图片点击可在新窗口打开查看

2、项目事件:AfterOpenProject

For Each dt As Table In Tables 

    Tables(dt.Name).SetColVisibleWidth(Functions.Execute("表获取列宽", user.Name, dt.Name))

Next

If User.Type <> UserTypeEnum.Developer Then

    Tables("窗口表列宽").Visible = False  '隐藏防止意外修改,只开发者可见

End If



图片点击可在新窗口打开查看此主题相关图片如下:项目代码2.png
图片点击可在新窗口打开查看

3、项目事件:BeforeLoadOuterTable

Select Case e.DataTableName

    Case "窗口表列宽" '窗口表列宽表无条件加载,避免未加载不能使用

End Select


图片点击可在新窗口打开查看此主题相关图片如下:项目代码3.png
图片点击可在新窗口打开查看

4、全局表事件:

AfterDragColumn ----鼠标拖动列标题,调整位置之后发生

Functions.Execute("表保存列宽", user.Name,CurrentTable.Name)'函数名,用户名,数据表

AfterResizeColumn-----用鼠标拖动列标题边界,调整列宽之后发生

Functions.Execute("表保存列宽", user.Name,CurrentTable.Name)'函数名,用户名,数据表


图片点击可在新窗口打开查看此主题相关图片如下:项目代码4.png
图片点击可在新窗口打开查看



四、窗口表设置,在窗口AfterLoad事件中设置函数。即使你最初的想法只想调整窗口表的列宽和顺序,前面的操作步骤仍然需要,但或许你可以自己简化。

 

Dim Result As DialogResult

Result = MessageBox.Show("是否选择自定义列方式打开?选否原表格式打开", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question)

If Result = DialogResult.Yes Then '选是则用自定义列方式也就是保存的窗口表列设置来打开

     Tables(e.Form.Name & "_table1").SetColVisibleWidth(Functions.Execute("表获取列宽", user.Name, e.Form.Name & "_table1"))

    Tables(e.Form.Name & "_table2").SetColVisibleWidth(Functions.Execute("表获取列宽", user.Name, e.Form.Name & "_table2"))

Else '选否则用原表格式也就是保存的窗口副本表对应的原表的列设置来打开

     Tables(e.Form.Name & "_table1").SetColVisibleWidth(Functions.Execute("表获取列宽", user.Name, Tables(e.Form.Name & "_table1").DataTable.Name))

    Tables(e.Form.Name & "_table2").SetColVisibleWidth(Functions.Execute("表获取列宽", user.Name, Tables(e.Form.Name & "_table2").DataTable.Name))

End If


4.1、此方式下窗口表通过绑定表的表属性中显示列进行的设置不再生效

4.2、此方式下窗口表通过绑定表的表属性--杂项--允许单击排序注意要设置为否,否则窗口表不能通过拖动来调整列的顺序,那将非常不方便,但可以调整列宽。

4.3、这里是举例是针对窗口绑定来的设置,独立窗口的表获取列宽的函数可能有点变化,将不再是绑定表的表达方式,而是所有者表的表达方式

4.4、举例的窗口中有2个绑定表,所以有两行(一行table1,一行table2),而且是两个方案所以用了IF函数,一直使用一种用IF中一个即可,就不会打开选择弹窗了。

4.5、没有全局窗口事件,所以有多少个窗口,就需要设置多少窗口,好在只设置一处窗口AfterLoad事件,而且代码都是一个,只需注意绑定了几个表。


图片点击可在新窗口打开查看此主题相关图片如下:窗口表列顺序和列宽调整.png
图片点击可在新窗口打开查看

使用右键3的方式调整时,不能单纯只操作隐藏或取消隐藏,因为这样不会触发保存宽列的函数,操作完要拖动一下任一列的列宽,这样就会保存列宽数据了。


五:提醒如下:

表和窗口表的获取列宽函数,在调到时表名参数是不一样的,但这里已经处理好,直接复制即可以用。

函数引用帮助:Functions.Execute(函数名, 参数1, 参数2, 参数3....),解释如下


图片点击可在新窗口打开查看此主题相关图片如下:项目代码5.png
图片点击可在新窗口打开查看


希望以上有帮助,我测试是没有问题的,如有请回复反馈。




[此贴子已经被作者于2024/6/16 12:11:09编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
lindong
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:468 积分:4132 威望:0 精华:0 注册:2013/12/9 0:52:00
  发帖心情 Post By:2024/6/15 15:24:00 [只看该作者]

顶你

 回到顶部
帅哥,在线噢!
有点蓝
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110558 积分:562680 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2024/6/17 9:05:00 [只看该作者]

多谢分享

 回到顶部