6

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

 1 year ago
source link: https://www.cnblogs.com/wuhuacong/p/17376610.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

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

8867-20230506103743267-1116536946.png

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

8867-20230506103815332-845475433.png

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK