套路化编程: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

相关文章

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

vscode保存代码时自动eslint格式化图文教程

《vscode保存代码时自动eslint格式化图文教程》:本文主要介绍vscode保存代码时自动eslint格式化的相关资料,包括打开设置文件并复制特定内容,文中通过代码介绍的非常详细,需要的朋友... 目录1、点击设置2、选择远程--->点击右上角打开设置3、会弹出settings.json文件,将以下内

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言