在Winform的分页控件里面,我们提供了很多丰富的功能,如常规分页,中文转义、导出Excel、导出PDF等,基于DevExpress的样式的分页控件,我们在其上面做了不少封装,以便更好的使用,其中就包括集成保存用户列表显示字段及宽度调整设置。本篇随笔介绍这个实现的过程,通过在当前程序中序列化方式存储一个记录用户设置的文件,提供介质的存储和加载处理。

1、集成保存用户列表显示字段及宽度调整设置的需求

在一些用户列表使用的反馈中,希望能够在调整列表字段和它的顺序,以及能够保存上次调整记录的宽度,因此,涉及到字段可见列表、字段顺序,列宽度的内容保存,这些功能应该是对用户透明的,不需要开发人员干预,也不需要用户过多操作就能实现的,也就是在用户调整的时候,自动记录这些信息,并存储起来,下一次打开页面的时候,自动加载上次的设置信息即可,逻辑也算比较简单。

因此我们需要检测用户对列宽度调整的事件,记录列字段宽度的信息,如果用户调整字段显示和顺序,那么控件也需要对它进行记录起来,供下次加载使用。

对于DevExpress的列宽调整,有一个事件,我们在控件逻辑中实现它,记录它的变化并存储即可

 this.gridView1.ColumnWidthChanged += GridView1_ColumnWidthChanged;

然后我们在事件的实现中,判断用户是否启用自定义设置处理,然后进行存储列宽处理即可。

        private void GridView1_ColumnWidthChanged(object sender, DevExpress.XtraGrid.Views.Base.ColumnEventArgs e)
{
//如果不设置,默认不处理
if (!this.EnableColumnsSetting) return; GridViewHelper.SaveColumnSetting(this.gridView1, this.ParentForm?.Name);
}

为了方便,我们把一些逻辑分离到一个独立的辅助文件上,实现代码如下所示。

/// <summary>
/// 保存列设置
/// </summary>
/// <param name="settings">当前设置信息</param>
/// <param name="gridViewName">视图名称</param>
/// <param name="parentFormName">父类窗体名称,用于区分</param>
public static void SaveColumnSetting(GridColumnSetting settings, string gridViewName, string parentFormName)
{
if (settings != null)
{
var folderPath = $"{Environment.CurrentDirectory}/ColumnSetting";
var filePath = $"{folderPath}/{parentFormName}.{gridViewName}.setting"; // 检查文件夹是否存在
if (!Directory.Exists(folderPath))
{
Directory.CreateDirectory(folderPath);
}
using (var stream = new FileStream(filePath, FileMode.Create))
{
var formatter = new BinaryFormatter();
formatter.Serialize(stream, settings);
}
}
}

上面主要就是对设置信息进行序列化到一个文件中进行中转,从而避免数据库的处理,同时又会因为不同用户记录不同的设置信息。对于不同的页面,我们通过表单名称来区分不同的设置,因为分页控件场景需要一个唯一的标识来区分不同的数据场景。

而对于可见字段,以及它的顺序调整,那么我们为了方便,提供一个设置的界面给终端用户使用即可,通过列表右键菜单触发入口,如下界面所示。

在列表框中列出界面的所有列(包括隐藏列),并通过拖动或者按钮调整顺序,通过勾选设置可见性,如下界面所示。

上面的列表控件,是一个标准的CheckedListBox控件,通过处理它的拖动事件,实现可拖动顺序的调整。

    // 绑定 ListBoxControl 控件的事件,实现拖拉处理
listBoxControl.DragDrop += ListBoxControl_DragDrop;
listBoxControl.DragOver += ListBoxControl_DragOver;
listBoxControl.MouseDown += ListBoxControl_MouseDown;

而读取上面的列表中的可见列字段及顺序,我们通过配置文件中进行读取,并反序列化即可。

/// <summary>
/// 获取配置信息
/// </summary>
/// <param name="gridView">当前视图</param>
/// <param name="parentFormName">父类窗体名称,用于区分</param>
/// <returns></returns>
public static GridColumnSetting GetSettings(GridView gridView, string parentFormName)
{
var folderPath = $"{Environment.CurrentDirectory}/ColumnSetting";
var filePath = $"{folderPath}/{parentFormName}.{gridView.Name}.setting";
if (!File.Exists(filePath)) return null; //反序列化
GridColumnSetting settings = null;
using (FileStream stream = new FileStream(filePath, FileMode.Open))
{
var formatter = new BinaryFormatter();
settings = (GridColumnSetting)formatter.Deserialize(stream);
}
return settings;
}

对于用户调整后的设置保存,记录好相关信息后进行序列化到文件中即可,如下实现逻辑所示。

private void btnOK_Click(object sender, EventArgs e)
{
//记录所有的列宽
var sb = new StringBuilder();
var visibleSb = new StringBuilder();
int index = 0;
foreach (var objItem in this.listBoxControl.Items)
{
var item = objItem as CListItem;
if (item != null)
{
var checkState = this.listBoxControl.GetItemChecked(index);
if (checkState)
{
var column = this.GridView.Columns.ColumnByFieldName(item.Value);
if (column != null)
{
sb.Append($"{item.Value}:{column.Width},");
visibleSb.Append($"{item.Value},");
}
}
}
index++;
} var columnsWidth = sb.ToString().Trim(',');
var columnsVisbile = visibleSb.ToString().Trim(',');
var settings = new GridColumnSetting(columnsWidth, columnsVisbile); //如果不设置,默认不处理
GridViewHelper.SaveColumnSetting(settings, this.GridView.Name, this.Owner?.Name);
}

最终,我们在开发具体页面数据展示的时候,把分页控件拖动到界面上就可以了,默认具有这些效果,不需要另外增加实现代码,从而通过封装的方式,简化了很多基础的功能处理,并能够给用户一致的体验和界面效果。

在Winform分页控件中集成保存用户列表显示字段及宽度调整设置的更多相关文章

  1. 在Winform分页控件中集成导出PDF文档的功能

    当前的Winform分页控件中,当前导出的数据一般使用Excel来处理,Excel的文档可以用于后期的数据展示或者批量导入做准备,因此是比较好的输入输出格式.但是有框架的使用客户希望分页控件能够直接导 ...

  2. 在DevExpress程序中使用Winform分页控件直接录入数据并保存

    一般情况下,我们都倾向于使用一个组织比较好的独立界面来录入或者展示相关的数据,这样处理比较规范,也方便显示比较复杂的数据.不过在一些情况下,我们也可能需要直接在GridView表格上直接录入或者修改数 ...

  3. 开发框架模块视频系列(2)-Winform分页控件介绍

    在软件开发过程中,为了节省开发时间,提高开发效率,统一用户处理界面,尽可能使用成熟.功能强大的分页控件,这款Winform环境下的分页控件,集成了数据分页.内容提示.数据打印.数据导出.表头中文转义等 ...

  4. 如何Windows分页控件中增加统计功能

    在我的博客里面,很多Winform程序里面都用到了分页处理,这样可以不管是在直接访问数据库的场景还是使用网络方式访问WCF服务获取数据,都能获得较好的效率,因此WInform程序里面的分页控件的使用是 ...

  5. winform 分页控件

    http://www.cnblogs.com/liuyunsheng/p/4853387.html http://www.cnblogs.com/wuhuacong/archive/2011/07/0 ...

  6. 类似web风格的 Winform 分页控件

    背景 最近做一个Winform的小程序,需要用到分页,由于之前一直在用 TonyPagerForWinForm.dll ,但该库没有源代码,网上找的也不全面,索性就准备自己改造一个.在园子里翻了一下, ...

  7. [原创]WinForm分页控件制作

    先简单说一下思路: 1.做一个分页控件的导航类,即记录总页数.当前页.每页记录数,下一页.上一页.跳转等操作的页数变更. class PageNavigation{/// <summary> ...

  8. 【NET】Winform分页控件初探

    public partial class WinFormPager : UserControl { ; /// <summary> /// 当前页 /// </summary> ...

  9. Winform分页控件

    设计界面: 控件代码: using System; using System.Collections.Generic; using System.ComponentModel; using Syste ...

  10. (Winform)控件中添加GIF图片以及运用双缓冲使其不闪烁以及背景是gif时使控件(如panel)变透明

    Image img = Image.FromFile(@"C:\Users\joeymary\Desktop\3.gif"); pictureBox1.Image =img.Clo ...

随机推荐

  1. 自定义组件中使用half-screen-dailog 无法舒勇外部样式

    为了将弹窗更方便的调用,封装了组件,但是发现一个问题, 外部样式类在组件中是无法正常使用的. 也就说在组件的wxss中是无法正常使用.weui-half-screen-dialog 这个外部样式类,然 ...

  2. Appium--滑动屏幕、不常用API

    1.滑动屏幕api #滑动屏幕 size = driver.get_window_size() #获取屏幕大小 width = size.get('width') #宽 height = size.g ...

  3. Navicat Premium 12安装包下载及安装

    Navicat Premium 12安装包下载及安装 安装成功了 前提:这个好像是64位的,32位的电脑 我不知道行不行没有试过 1.发邮件17673114272@163.com获取资源后    解压 ...

  4. 第八次团队作业:Beta冲刺(凡事预则立)

    这个作业属于哪个课程 2018级计算机和综合实验班 这个作业要求在哪里 Beta冲刺要求 这个作业的目标 Beta冲刺 改进完善的功能 完善之前年度报告功能 尽快上线小程序 增加的新功能 小程序打卡功 ...

  5. NTP同步时间

    什么是NTPNTP:Network Time Protocol(网络时间协议) ️ NTP 是用于同步网络中计算机时间的协议.它的用途是把计算机的时钟同步到世界协调时UTC. UTC:Universa ...

  6. [极客大挑战 2019]Upload 1

    进入可以看到,这时一道文件上传题目 直接上传test.php 提示Not image不是图片,可能是MIME绕过,尝试抓包修改Content-Type 提示Not php,猜测可能是检测后缀名不能是p ...

  7. Android--观察APP运行日志以及APP的工程目录结构解释

    运行日志 Log:d--便于跟踪调试 APP开发基础 APP的运行环境 第一种情况,就是在Android studio软件客户端上面使用模拟器运行APP 第二种情况,就是使用真实的手机运行APP程序 ...

  8. Javaweb学习笔记第五弹

    preparedStatement 防止SQL注入:将敏感字符进行转义 1.获取PreparedStatement对象 String sql="selct * from 表名 where 列 ...

  9. 灵感宝盒新增「线上云展会」产品,「直播观赏联动」等你共建丨RTE NG-Lab 双周报

    前言 哈喽各位开发者,「RTE NG-Lab 双周报」如期而至! 近两周,我们更新了一些新的实时互动场景和产品,也举办了代码实验室的第一次线下活动,与大家一起体验了声网最新的 4.0 SDK. 灵感宝 ...

  10. Eclipse安装和配置环境教程(图文详解)

    前言 在上一篇文章中,壹哥给大家介绍了Notepad++这个更高级点的记事本,它进行Java开发相比windows自带的记事本要更方便一些.但是即便如此,用这种记事本进行Java开发效率依然很低.如果 ...