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

yizhihongxing

在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);
        }
    }
}

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

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

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

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

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

 上面的列表控件,是一个标准的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);
}

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

 

原文链接:https://www.cnblogs.com/wuhuacong/p/17376610.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在Winform分页控件中集成保存用户列表显示字段及宽度调整设置 - Python技术站

(0)
上一篇 2023年5月11日
下一篇 2023年5月11日

相关文章

  • C#中判断一个集合是否是另一个集合的子集的简单方法

    判断一个集合是否是另一个集合的子集,可以使用 C# 中的 LINQ (Language Integrated Query) 扩展方法来实现。 下面是判断一个集合是否是另一个集合的子集的简单方法: using System.Linq; // 判断一个集合是否是另一个集合的子集的简单方法 public static bool IsSubset<T>(…

    C# 2023年6月8日
    00
  • C#中math类的全部运算方法(总结)

    C#中Math类的全部运算方法(总结) Math类是C#中一个非常重要的数学计算类,它提供了丰富的方法来对数字进行各种数学运算,比如绝对值、三角函数、对数、幂等函数等等。在本篇文章中,我将对Math类的全部运算方法进行详细的总结和解释,方便大家快速了解和应用。 绝对值和抹零函数 Math.Abs()方法 Math.Abs()方法可以返回一个数的绝对值。简单来…

    C# 2023年6月7日
    00
  • asp.net 序列化and反序列化演示

    下面我来为你详细讲解一下 “ASP.NET 序列化和反序列化演示” 的攻略。 简介 在 ASP.NET 开发中,序列化和反序列化是一个非常重要的操作。序列化可以将对象转化为字节流或者xml格式,并存储在内存或者文件中。反序列化则是将字节流或者xml格式的数据重新转化为对象。序列化和反序列化通常用于跨应用程序或网络传输对象时使用,例如:通过web服务发送和接收…

    C# 2023年6月3日
    00
  • c# Thread类线程常用操作详解

    c#Thread类线程常用操作详解 什么是Thread类 Thread 类提供了访问和操作线程的一系列方法和属性。开发人员可以新建和控制线程、设置线程的优先级、执行线程的暂停、继续、等待操作等。Thread 类定义在 System.Threading 命名空间中。 如何创建一个线程 使用 Thread 类来创建一个新线程: Thread thread1 = …

    C# 2023年5月15日
    00
  • VS Code里使用Debugger for Unity插件调试的方法(2023最新版)

    VS Code里使用Debugger for Unity插件调试的方法 如果你想在 Visual Studio Code 中使用 Debugger for Unity 插件进行 Unity 项目的调试,可以按照以下步骤操作。 第1步:下载与安装 首先,在 Visual Studio Code 中选择插件(Ctrl+Shift+X 或者 Cmd+Shift+X…

    C# 2023年6月3日
    00
  • C#实现控制电脑注销,关机和重启

    以下是C#实现控制电脑注销、关机和重启的完整攻略: 1. 获取系统权限 为了能够控制电脑的操作,首先需要获取系统管理员权限。 可以使用以下代码获取管理员权限: ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.Verb = "runas"; startInfo.F…

    C# 2023年5月14日
    00
  • C# File.ReadAllText – 读取文件的所有内容

    File.ReadAllText 方法是C#中的一个方法,其作用是读取指定文件的全部内容并返回一个字符串。 该方法的用法如下: string text = File.ReadAllText(string path); 其中,path 表示要读取的文件的路径,可以是相对路径或绝对路径。该方法还提供了其他参数,如编码方式的设置等。 该方法的返回值是一个字符串,表…

    C# 2023年4月19日
    00
  • asp最简单的生成验证码代码

    生成验证码是一种常见的验证身份与防止恶意攻击的方法。在ASP上生成验证码可以用一些现成的工具或者自己编写代码实现。下面是ASP最简单的生成验证码代码及其攻略,包含了两条示例说明: 生成验证码的原理 生成验证码有一个基本的原理,就是将一段字符随机渲染到图像上,然后用户需要通过输入图像上的字符来证明他们是人类而不是机器。根据这个原理,我们可以使用ASP内置的组件…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部