套路化编程:C# ListView 保存、恢复列宽度

2024-06-21 14:44

本文主要是介绍套路化编程:C# ListView 保存、恢复列宽度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


目录

技术基础

保存列头

删除列头

恢复列头

奇怪的BUG:不能在多处添加或插入项

控件的Tag

处理逻辑

示例代码


        如果界面上需要显示不同的列表(主要是列头不同),有几种思路实现:

  • 动态创建ListView,处理显示位置比较麻烦,还涉及到窗口缩放时的处理
  • 静态创建多个,按需要显示隐藏,多个重叠控件的初始位置可以在初始化时设置一次
  • 单个静态控件,难点是记录正确的列头宽度,本文就谈论这个问题

技术基础

保存列头

listView.Columns数组就是列头,保存下来即可

删除列头

listView.Columns.RemoveAt(3);

         删除指定位置的列。

恢复列头

        删除之后再添加即可。

奇怪的BUG:不能在多处添加或插入项

        这个很头疼,其实是ColumnHeader对象不能复用,要先克隆,所以保存列头是的代码是这样的:

					old_headers.Add(listView.Columns[3].Clone() as ColumnHeader);

控件的Tag

        所有控件包括控件的数据条目都有tag属性,可以用来绑定数据,tag是Object类型的,可以绑定任何数据结构。

        强烈建议专门定义tag结构而不要直接使用string或者现成的对象,因为需要在tag里增加信息的情形是很多的。

        本示例代码涉及到一个树和一个列表,相关信息记录在树节点的tag和列表的tag里。

处理逻辑

        其实逻辑还是稍微有点复杂的:

  • 如果ListView没有列,直接创建需要的列
  • 如果ListView已经有列,符合需要,什么也不做
  • 如果ListView已经有列,不符合需要,保存现有列头,然后检查是否存在已经保存的列头,有则恢复,没有则直接创建

示例代码

        本示例代码的列表显示只有两种,同种类型的列头显示宽度会被记录,不会因为切换显示而改变。

		//这两个是旧列头,隧道协议所需的列只有一个,其余则有很多static List<ColumnHeader> columnHeaders_std = new List<ColumnHeader>();static List<ColumnHeader> columnHeaders_tunnel = new List<ColumnHeader>();//这个函数根据树节点来显示static public bool ShowChannels(TreeNode deviceNode, ListView listView){NodeTag? tag= deviceNode.Tag as NodeTag;//这个tag是要显示的新信息if (null == tag) return false;if(tag.nodeType!= NodeTag.NodeType.NODETYPE_DEVICE)return false;listView.Items.Clear();if (0 == listView.Columns.Count){//两种情形共有的三个列listView.Columns.Add("序号");listView.Columns.Add("Code");listView.Columns.Add("Name");}//保存可变部分string? old_code = (listView.Tag as NodeTag)?.protocolCode;//当前ListView的tag是旧信息if (null != old_code){List<ColumnHeader> old_headers;if (ProtocolCode.isTunnel(old_code)){old_headers = columnHeaders_tunnel;}else{old_headers = columnHeaders_std;}old_headers.Clear();while (listView.Columns.Count > 3){old_headers.Add(listView.Columns[3].Clone() as ColumnHeader);//注意这里没有Clone会有随机BUG并且列头宽度会错误listView.Columns.RemoveAt(3);}}//恢复可变部分,如果还没有保存过,直接创建if (ProtocolCode.isTunnel(tag.protocolCode)){if (columnHeaders_tunnel.Count > 0) listView.Columns.AddRange(columnHeaders_tunnel.ToArray());else{listView.Columns.Add("paramCommand");}}else{if (columnHeaders_std.Count > 0) listView.Columns.AddRange(columnHeaders_std.ToArray());else{listView.Columns.Add("Type");listView.Columns.Add("Addr");listView.Columns.Add("function");listView.Columns.Add("transfer");listView.Columns.Add("Length");listView.Columns.Add("process");listView.Columns.Add("report");}}......(这里显示列表数据)listView.Tag = tag;//更新listview的tagreturn true;}

(这里是结束)

这篇关于套路化编程:C# ListView 保存、恢复列宽度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081507

相关文章

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

C#实现高性能拍照与水印添加功能完整方案

《C#实现高性能拍照与水印添加功能完整方案》在工业检测、质量追溯等应用场景中,经常需要对产品进行拍照并添加相关信息水印,本文将详细介绍如何使用C#实现一个高性能的拍照和水印添加功能,包含完整的代码实现... 目录1. 概述2. 功能架构设计3. 核心代码实现python3.1 主拍照方法3.2 安全HBIT

C#实现SHP文件读取与地图显示的完整教程

《C#实现SHP文件读取与地图显示的完整教程》在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平... 目录概述功能特点核心代码解析1. 文件读取与初始化2. 坐标转换3. 图形绘制4. 地图交互功能缩放

C#使用SendMessage实现进程间通信的示例代码

《C#使用SendMessage实现进程间通信的示例代码》在软件开发中,进程间通信(IPC)是关键技术之一,C#通过调用WindowsAPI的SendMessage函数实现这一功能,本文将通过实例介绍... 目录第一章:SendMessage的底层原理揭秘第二章:构建跨进程通信桥梁2.1 定义通信协议2.2

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很