以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- [分享]表及窗口表列宽调整自定义列宽列宽保存设置保存列顺序调整列顺序保存设置 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=192336) |
-- 作者:xiangwei_zeng -- 发布时间:2024/6/15 8:16:00 -- [分享]表及窗口表列宽调整自定义列宽列宽保存设置保存列顺序调整列顺序保存设置 方便有需要的人搜索,所以标题显得很怪异,用过搜索的人可能能理解 过程中花费了很多时间,因为非专业的,所以水平有限,学得慢,不断测试才弄懂使用,也是第一次学习使用函数。 学习的来源帖如下:
优化后好处如下: 1、拖动列宽和调整列顺序后,根据不同用户分别保存设置,项目打开后是新设置好的顺序 2、列宽表数据无初始值,默认按初始值打开,只要拖动列宽或列顺序就会保存数据供下次调用 3、加载和隐藏表防止未加载表或意外修改表,导致不能正常使用。 4、初始和使用中都不需要单独登记列宽表数据,窗口表也一样适用,简单粗暴 实现过程优化后如下: 一、建一个表保存列宽设置后的数据(实际使用中发现窗口名称和窗口表名这两列实际不需要使用,但是这是后发现的,所以也不改图片了) 建好表什么也不用管,初始和使用中不需要录入数据。 二、建立函数来保存和获取表的列宽数据 原以为表界面和窗口界面的设置不一样,我分别设置函数,实际上测试保存和获取各一个函数即可,表是统一设置,窗口表是每个窗口都要单独设置,因为没有全局窗口事件 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 三、全局表事件,经此设置,所有表都可以使用,包括关联表 1、项目事件:Initialize For Each dt As DataTable In DataTables dt.GlobalHandler.AfterDragColumn = True dt.GlobalHandler.AfterResizeColumn = True Next 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 3、项目事件:BeforeLoadOuterTable Select Case e.DataTableName Case "窗口表列宽" \'窗口表列宽表无条件加载,避免未加载不能使用 End Select 4、全局表事件: AfterDragColumn ----鼠标拖动列标题,调整位置之后发生 Functions.Execute("表保存列宽", user.Name,CurrentTable.Name)\'函数名,用户名,数据表 AfterResizeColumn-----用鼠标拖动列标题边界,调整列宽之后发生 Functions.Execute("表保存列宽", user.Name,CurrentTable.Name)\'函数名,用户名,数据表 四、窗口表设置,在窗口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事件,而且代码都是一个,只需注意绑定了几个表。 使用右键3的方式调整时,不能单纯只操作隐藏或取消隐藏,因为这样不会触发保存宽列的函数,操作完要拖动一下任一列的列宽,这样就会保存列宽数据了。 五:提醒如下: 表和窗口表的获取列宽函数,在调到时表名参数是不一样的,但这里已经处理好,直接复制即可以用。 函数引用帮助:Functions.Execute(函数名, 参数1, 参数2, 参数3....),解释如下 希望以上有帮助,我测试是没有问题的,如有请回复反馈。 [此贴子已经被作者于2024/6/16 12:11:09编辑过]
|
-- 作者:lindong -- 发布时间:2024/6/15 15:24:00 -- 顶你 |
-- 作者:有点蓝 -- 发布时间:2024/6/17 9:05:00 -- 多谢分享 |