翼度科技»论坛 编程开发 .net 查看内容

在Winform分页控件中集成保存用户列表显示字段及宽度调整设置

6

主题

6

帖子

18

积分

新手上路

Rank: 1

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

在一些用户列表使用的反馈中,希望能够在调整列表字段和它的顺序,以及能够保存上次调整记录的宽度,因此,涉及到字段可见列表、字段顺序,列宽度的内容保存,这些功能应该是对用户透明的,不需要开发人员干预,也不需要用户过多操作就能实现的,也就是在用户调整的时候,自动记录这些信息,并存储起来,下一次打开页面的时候,自动加载上次的设置信息即可,逻辑也算比较简单。
因此我们需要检测用户对列宽度调整的事件,记录列字段宽度的信息,如果用户调整字段显示和顺序,那么控件也需要对它进行记录起来,供下次加载使用。
对于DevExpress的列宽调整,有一个事件,我们在控件逻辑中实现它,记录它的变化并存储即可
  1. this.gridView1.ColumnWidthChanged += GridView1_ColumnWidthChanged;
复制代码
然后我们在事件的实现中,判断用户是否启用自定义设置处理,然后进行存储列宽处理即可。
  1.         private void GridView1_ColumnWidthChanged(object sender, DevExpress.XtraGrid.Views.Base.ColumnEventArgs e)
  2.         {
  3.             //如果不设置,默认不处理
  4.             if (!this.EnableColumnsSetting) return;
  5.             GridViewHelper.SaveColumnSetting(this.gridView1, this.ParentForm?.Name);
  6.         }
复制代码
为了方便,我们把一些逻辑分离到一个独立的辅助文件上,实现代码如下所示。
  1. /// <summary>
  2. /// 保存列设置
  3. /// </summary>
  4. /// <param name="settings">当前设置信息</param>
  5. /// <param name="gridViewName">视图名称</param>
  6. /// <param name="parentFormName">父类窗体名称,用于区分</param>
  7. public static void SaveColumnSetting(GridColumnSetting settings, string gridViewName,  string parentFormName)
  8. {
  9.     if (settings != null)
  10.     {
  11.         var folderPath = $"{Environment.CurrentDirectory}/ColumnSetting";
  12.         var filePath = $"{folderPath}/{parentFormName}.{gridViewName}.setting";
  13.         // 检查文件夹是否存在
  14.         if (!Directory.Exists(folderPath))
  15.         {
  16.             Directory.CreateDirectory(folderPath);
  17.         }
  18.         using (var stream = new FileStream(filePath, FileMode.Create))
  19.         {
  20.             var formatter = new BinaryFormatter();
  21.             formatter.Serialize(stream, settings);
  22.         }
  23.     }
  24. }
复制代码
上面主要就是对设置信息进行序列化到一个文件中进行中转,从而避免数据库的处理,同时又会因为不同用户记录不同的设置信息。对于不同的页面,我们通过表单名称来区分不同的设置,因为分页控件场景需要一个唯一的标识来区分不同的数据场景。
而对于可见字段,以及它的顺序调整,那么我们为了方便,提供一个设置的界面给终端用户使用即可,通过列表右键菜单触发入口,如下界面所示。

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

 上面的列表控件,是一个标准的CheckedListBox控件,通过处理它的拖动事件,实现可拖动顺序的调整。
  1.     // 绑定 ListBoxControl 控件的事件,实现拖拉处理
  2.     listBoxControl.DragDrop += ListBoxControl_DragDrop;
  3.     listBoxControl.DragOver += ListBoxControl_DragOver;
  4.     listBoxControl.MouseDown += ListBoxControl_MouseDown;
复制代码
而读取上面的列表中的可见列字段及顺序,我们通过配置文件中进行读取,并反序列化即可。
  1. /// <summary>
  2. /// 获取配置信息
  3. /// </summary>
  4. /// <param name="gridView">当前视图</param>
  5. /// <param name="parentFormName">父类窗体名称,用于区分</param>
  6. /// <returns></returns>
  7. public static GridColumnSetting GetSettings(GridView gridView, string parentFormName)
  8. {
  9.     var folderPath = $"{Environment.CurrentDirectory}/ColumnSetting";
  10.     var filePath = $"{folderPath}/{parentFormName}.{gridView.Name}.setting";
  11.     if (!File.Exists(filePath)) return null;
  12.     //反序列化
  13.     GridColumnSetting settings = null;
  14.     using (FileStream stream = new FileStream(filePath, FileMode.Open))
  15.     {
  16.         var formatter = new BinaryFormatter();
  17.         settings = (GridColumnSetting)formatter.Deserialize(stream);
  18.     }
  19.     return settings;
  20. }
复制代码
对于用户调整后的设置保存,记录好相关信息后进行序列化到文件中即可,如下实现逻辑所示。
  1. private void btnOK_Click(object sender, EventArgs e)
  2. {
  3.     //记录所有的列宽
  4.     var sb = new StringBuilder();
  5.     var visibleSb = new StringBuilder();
  6.     int index = 0;
  7.     foreach (var objItem in this.listBoxControl.Items)
  8.     {
  9.         var item = objItem as CListItem;
  10.         if (item != null)
  11.         {
  12.             var checkState = this.listBoxControl.GetItemChecked(index);
  13.             if (checkState)
  14.             {
  15.                 var column = this.GridView.Columns.ColumnByFieldName(item.Value);
  16.                 if (column != null)
  17.                 {
  18.                     sb.Append($"{item.Value}:{column.Width},");
  19.                     visibleSb.Append($"{item.Value},");
  20.                 }
  21.             }
  22.         }
  23.         index++;
  24.     }
  25.     var columnsWidth = sb.ToString().Trim(',');
  26.     var columnsVisbile = visibleSb.ToString().Trim(',');
  27.     var settings = new GridColumnSetting(columnsWidth, columnsVisbile);
  28.     //如果不设置,默认不处理
  29.     GridViewHelper.SaveColumnSetting(settings, this.GridView.Name, this.Owner?.Name);
  30. }
复制代码
最终,我们在开发具体页面数据展示的时候,把分页控件拖动到界面上就可以了,默认具有这些效果,不需要另外增加实现代码,从而通过封装的方式,简化了很多基础的功能处理,并能够给用户一致的体验和界面效果。
 

来源:https://www.cnblogs.com/wuhuacong/archive/2023/05/06/17376610.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具