当前位置: 首页 > article >正文

WinForm真入门(14)——ListView控件详解

一、ListView 控件核心概念与功能

‌ListView‌ 是 WinForm 中用于展示结构化数据的多功能列表控件,支持多列、多视图模式及复杂交互,常用于文件资源管理器、数据报表等场景‌
核心特点‌:

  • 支持 ‌5种视图模式‌:Details(详细视图)、List(列表)、LargeIcon(大图标)、SmallIcon(小图标)、Tile(平铺视图)‌
  • 支持 ‌多列数据展示‌,可自定义列标题、列宽及对齐方式‌。
  • 提供 ‌整行选择‌、‌复选框操作‌、‌数据排序‌ 等高级功能‌。

二、ListView 关键属性与方法

1. ‌核心属性‌

属性说明适用视图模式
‌View‌设置视图模式(默认 LargeIcon),Details 模式显示多列数据‌。所有模式
‌Columns‌管理列集合(仅 Details 模式有效),支持添加列标题及设置列宽‌。Details
‌FullRowSelect‌是否启用整行选中(仅 Details 模式有效)‌。Details
‌GridLines‌显示行列分割线(仅 Details 模式有效)‌。Details
‌CheckBoxes‌在项旁显示复选框,支持多选操作‌。所有模式
‌Items‌管理主项集合(ListViewItem 对象),支持动态增删‌。所有模式

2. ‌常用方法‌

  • 动态添加项‌:
// 添加主项及子项  
ListViewItem item = new ListViewItem("主项1");  
item.SubItems.Add("子项1");  
listView1.Items.Add(item);  

说明:SubItems 集合用于添加子项,仅在 Details 模式下可见‌。

  • 批量操作优化‌:
istView1.BeginUpdate();  // 暂停界面刷新  
for (int i = 0; i < 100; i++) {  listView1.Items.Add($"Item {i}");  
}  
listView1.EndUpdate();    // 恢复刷新  

说明:提升大数据量操作性能‌。

3. ‌核心事件‌

  • SelectedIndexChanged‌:选中项变化时触发‌。
  • ItemCheck‌:复选框状态变化时触发‌。

三、ListView 与 ListBox 的核心区别

‌对比维度‌‌ ListView‌‌ ‌ListBox‌
‌继承关系‌‌ 继承自 ListBox,扩展了 View 属性‌。‌ 基础列表控件,无多视图支持‌。
‌视图模式‌‌ 支持多列、图标视图(如 Details)‌。‌ 仅支持单列列表‌。
‌选择模式‌‌ 默认 Extended(扩展多选)‌。‌ 默认 Single(单选)‌。
‌数据展示‌‌ 可显示子项(SubItems)及多列标题‌。‌ 仅显示简单文本项‌。
‌典型场景‌‌ 文件资源管理器、数据库表格‌。‌ 简单选项列表(如城市选择)‌。

四、ListView 完整案例

案例1:动态创建多列列表(Details 视图)
‌需求‌:创建包含姓名、年龄、部门的多列列表,支持整行选中。
‌代码实现‌:

// 设置视图模式及列标题  
listView1.View = View.Details;  
listView1.Columns.Add("姓名", 120);  
listView1.Columns.Add("年龄", 80);  
listView1.Columns.Add("部门", 150);  
listView1.FullRowSelect = true;  // 添加数据项  
List<Employee> employees = GetEmployeesFromDB(); // 假设从数据库获取数据  
foreach (Employee emp in employees) {  ListViewItem item = new ListViewItem(emp.Name);  item.SubItems.Add(emp.Age.ToString());  item.SubItems.Add(emp.Department);  listView1.Items.Add(item);  
}  

说明:通过 SubItems 添加子项,Details 模式下显示多列数据‌。


案例2:多选数据导出到 Excel
‌需求‌:勾选多项后导出选中数据到 Excel 文件。
‌代码实现‌:

// 启用复选框  
listView1.CheckBoxes = true;  // 导出按钮事件  
private void btnExport_Click(object sender, EventArgs e) {  using (ExcelPackage package = new ExcelPackage()) {  var worksheet = package.Workbook.Worksheets.Add("数据导出");  int row = 1;  // 写入列标题  for (int i = 0; i < listView1.Columns.Count; i++) {  worksheet.Cells[1, i + 1].Value = listView1.Columns[i].Text;  }  // 写入选中项数据  foreach (ListViewItem item in listView1.CheckedItems) {  row++;  for (int col = 0; col < item.SubItems.Count; col++) {  worksheet.Cells[row, col + 1].Value = item.SubItems[col].Text;  }  }  File.WriteAllBytes("导出数据.xlsx", package.GetAsByteArray());  }  
}  

说明:通过 CheckedItems 集合遍历选中项,结合 Excel 库生成文件‌。


案例3:自定义排序与搜索
‌需求‌:按部门排序并支持关键词搜索。
‌代码实现‌:

// 自定义排序类  
public class ListViewItemComparer : IComparer {  private int colIndex;  public ListViewItemComparer(int column) { colIndex = column; }  public int Compare(object x, object y) {  string a = ((ListViewItem)x).SubItems[colIndex].Text;  string b = ((ListViewItem)y).SubItems[colIndex].Text;  return string.Compare(a, b);  }  
}  // 按部门排序  
listView1.ListViewItemSorter = new ListViewItemComparer(2);  
listView1.Sort();  // 关键词搜索  
private void txtSearch_TextChanged(object sender, EventArgs e) {  listView1.BeginUpdate();  foreach (ListViewItem item in listView1.Items) {  item.BackColor = item.Text.Contains(txtSearch.Text) ? Color.Yellow : Color.White;  }  listView1.EndUpdate();  
}  

说明:通过自定义 IComparer 实现排序,动态高亮匹配项‌。


五、注意事项与最佳实践

‌性能优化‌:

  • 批量操作时使用 BeginUpdate() 和 EndUpdate() 减少界面闪烁‌。
  • 避免在循环中频繁修改 Items 集合。

‌索引管理‌:

  • 删除多项时需 ‌倒序操作‌,防止索引越界‌。
for (int i = listView1.Items.Count - 1; i >= 0; i--) {  if (条件) listView1.Items.RemoveAt(i);  
}  

总结

ListView 是 WinForm 中功能强大的列表控件,适用于 ‌多列数据展示‌ 和 ‌复杂交互场景‌,而 ListBox 更适合 ‌简单选项选择‌。通过合理使用 Details 视图、Columns 和 SubItems,可高效实现文件管理、报表生成等需求‌。开发者需结合场景选择控件,并注意性能优化与交互逻辑的完善。

相关文章:

WinForm真入门(14)——ListView控件详解

一、ListView 控件核心概念与功能 ‌ListView‌ 是 WinForm 中用于展示结构化数据的多功能列表控件&#xff0c;支持多列、多视图模式及复杂交互&#xff0c;常用于文件资源管理器、数据报表等场景‌。 核心特点‌&#xff1a; 支持 ‌5种视图模式‌&#xff1a;Details&…...

Python + Playwright:规避常见的UI自动化测试反模式

Python + Playwright:规避常见的UI自动化测试反模式 前言反模式一:整体式页面对象(POM)反模式二:具有逻辑的页面对象 - POM 的“越界”行为反模式三:基于 UI 的测试设置 - 缓慢且脆弱的“舞台搭建”反模式四:功能测试过载 - “试图覆盖一切”的测试反模式之间的关联与核…...

从服务器多线程批量下载文件到本地

1、客户端安装 aria2 下载地址&#xff1a;aria2 解压文件&#xff0c;然后将文件目录添加到系统环境变量Path中&#xff0c;然后打开cmd&#xff0c;输入&#xff1a;aria2c 文件地址&#xff0c;就可以下载文件了 2、服务端配置nginx文件服务器 server {listen 8080…...

循环神经网络 - 深层循环神经网络

如果将深度定义为网络中信息传递路径长度的话&#xff0c;循环神经网络可以看作既“深”又“浅”的网络。 一方面来说&#xff0c;如果我们把循环网络按时间展开&#xff0c;长时间间隔的状态之间的路径很长&#xff0c;循环网络可以看作一个非常深的网络。 从另一方面来 说&…...

linux运维篇-Ubuntu(debian)系操作系统创建源仓库

适用范围 适用于Ubuntu&#xff08;Debian&#xff09;及其衍生版本的linux系统 例如&#xff0c;国产化操作系统kylin-desktop-v10 简介 先来看下我们需要创建出来的仓库目录结构 Deb_conf_test apt源的主目录 conf 配置文件存放目录 conf目录下存放两个配置文件&…...

深度学习之微积分

2.4.1 导数和微分 2.4.2 偏导数 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/17227e00adb14472902baba4da675aed.png 2.4.3 梯度 具体证明&#xff0c;矩阵-向量积...

20242817李臻《Linux⾼级编程实践》第7周

20242817李臻《Linux⾼级编程实践》第7周 一、AI对学习内容的总结 第八章&#xff1a;多线程编程 8.1 多线程概念 进程与线程的区别&#xff1a; 进程是资源分配单位&#xff0c;拥有独立的地址空间、全局变量、打开的文件等。线程是调度单位&#xff0c;在同一进程内的线程…...

浙江大学:DeepSeek如何引领智慧医疗的革新之路?|48页PPT下载方法

导 读INTRODUCTION 随着人工智能技术的飞速发展&#xff0c;DeepSeek等大模型正在引领医疗行业进入一个全新的智慧医疗时代。这些先进的技术不仅正在改变医疗服务的提供方式&#xff0c;还在提高医疗质量和效率方面展现出巨大潜力。 想象一下&#xff0c;当你走进医院&#xff…...

Android基础彻底解析-APK入口点,xml,组件,脱壳,逆向

第一章:引言与背景 Android逆向工程,作为一种深入分析Android应用程序的技术,主要目的就是通过分析应用的代码、资源和行为来理解其功能、结构和潜在的安全问题。它不仅仅是对应用进行破解或修改,更重要的是帮助开发者、研究人员和安全人员发现并解决安全隐患。 本文主要对…...

ubuntu 2204 安装 vcs 2018

安装评估 系统 : Ubuntu 22.04.1 LTS 磁盘 : ubuntu 自身占用了 9.9G , 按照如下步骤 安装后 , 安装后的软件 占用 13.1G 仓库 : 由于安装 libpng12-0 , 添加了一个仓库 安装包 : 安装了多个包(lsb及其依赖包 libpng12-0)安装步骤 参考 ubuntu2018 安装 vcs2018 安装该…...

Express中间件(Middleware)详解:从零开始掌握(3)

实用中间件模式25例 1. 基础增强模式 请求属性扩展 function extendRequest() {return (req, res, next) > {req.getClientLanguage () > {return req.headers[accept-language]?.split(,)[0] || en;};next();}; } 响应时间头 function responseTime() {return (r…...

深入理解微信小程序开发:架构、组件化与进阶实战

&#x1f4d8;博文正文&#xff1a; 深入理解微信小程序开发&#xff1a;架构、组件化与进阶实战 微信小程序已成为移动互联网的重要入口。随着业务复杂度提升&#xff0c;仅靠入门知识已无法应对日常开发需求。本文将深入剖析小程序开发架构、组件化模式、状态管理、网络封装…...

逆向|中国产业政策大数据平台|请求体加密

2025-04-11 逆向地址:aHR0cDovL3poZW5nY2UuMmIuY24v 打开开发者工具出现debugger,直接注入脚本过掉无限debugger let aaa Function.prototype.constructor; Function.prototype.constructor function (params) { if(params ‘debugger’){ console.log(params); return null…...

在SpringBoot中访问 static 与 templates 目录下的内容

目录 步骤一&#xff1a;添加 Thymeleaf 依赖 (处理 Templates 目录)步骤二&#xff1a;配置静态资源路径 (可选但建议了解)步骤三&#xff1a;访问不同目录下的 HTML 文件访问 static 目录下的 HTML 文件访问 templates 目录下的 HTML 文件 总结 在使用 Spring Boot 开发 Web …...

游戏引擎学习第226天

引言&#xff0c;计划 我们目前的目标是开始构建“元游戏”结构。所谓元游戏&#xff0c;指的是不直接属于核心玩法本身&#xff0c;但又是游戏体验不可或缺的一部分&#xff0c;比如主菜单、标题画面、存档选择、选项设置、过场动画等。我们正在慢慢将这些系统结构搭建起来。…...

青少年编程与数学 02-016 Python数据结构与算法 22课题、并行算法

青少年编程与数学 02-016 Python数据结构与算法 22课题、并行算法 一、GPU并行计算矩阵乘法示例 二、MPI并行计算allgather操作示例 三、Python中的并行计算多线程并行计算多进程并行计算 四、SIMD并行计算SIMD并行计算示例 总结 课题摘要: 并行算法是通过同时执行多个任务或操…...

Ubuntu系统18.04更新驱动解决方法

原始是&#xff1a;ubuntu18.04里面的驱动是470&#xff0c;对应cuda11.4 现在需要更新为525&#xff0c;对应cuda为12.0 实现&#xff1a; 1、打开终端 Ctrl Alt T2、使用 lspci 命令&#xff08;快速查看显卡型号&#xff09; lspci | grep -i vga3、终端输入 ubuntu-d…...

Notepad++安装Markdown实时预览插件

具体操作 打开notepad -> 插件 -> 插件管理 -> 可用 -> “Markdown Panel” -> 安装&#xff0c;安装完成后工具栏点击"Markdown Panel"按钮。 注意&#xff1a;由于网络等原因可能安装失败 导致工具栏没出现""Markdown Panel"按钮&am…...

Mysql-视图和存储过程

视图 1.介绍 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。 通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条…...

FreeRTOS入门与工程实践-基于STM32F103(二)(互斥量,事件组,任务通知,软件定时器,中断管理,资源管理,调试与优化)

互斥量 一、互斥量&#xff08;Mutex&#xff09;&#xff1a;解决多任务 “抢资源” 的问题 1. 是什么&#xff1f; 互斥量是一种 “任务间互斥访问资源” 的工具&#xff0c;本质是一个 只能被锁定&#xff08;0&#xff09;或释放&#xff08;1&#xff09;的二进制信号量…...

stm32面试

数据结构相关问题 stm32面试 数据结构相关问题 目录基础数据结构树与图排序与查找算法 Linux相关问题Linux系统基础Linux命令与脚本Linux网络与服务 操作系统相关问题操作系统基础概念操作系统调度算法操作系统同步与通信 STM32相关问题STM32硬件基础STM32编程与开发STM32应用与…...

202524 | 分布式事务

分布式事务&#xff08;Distributed Transaction&#xff09; 分布式事务是指跨多个数据库、服务或系统节点的事务操作&#xff0c;要求所有参与方要么全部成功提交&#xff0c;要么全部回滚&#xff0c;保证数据一致性。 1. 为什么需要分布式事务&#xff1f; 在单体应用中&…...

Python 企业级架构实战(上篇)

深入企业级系统设计与高可用架构,掌握构建可扩展 Python 系统的核心技能。 41. 微服务架构设计与 FastAPI 实现 多服务协同开发示例 # 用户服务 (user_service/main.py) from fastapi import FastAPI app = FastAPI() users_db = { 1: {"id": 1, "name&…...

在 macOS 上修改 最大文件描述符限制(Too many open files) 和 网络端口相关参数 需要调整系统级配置的详细步骤

在 macOS 上修改 最大文件描述符限制&#xff08;Too many open files&#xff09; 和 网络端口相关参数 需要调整系统级配置。以下是详细步骤&#xff1a; 在 macOS 上修改 最大文件描述符限制&#xff08;Too many open files&#xff09; 和 网络端口相关参数 需要调整系统级…...

Python 文本和字节序列(字符问题)

本章将讨论下述话题&#xff1a; 字符、码位和字节表述 bytes、bytearray 和 memoryview 等二进制序列的独特特性 全部 Unicode 和陈旧字符集的编解码器 避免和处理编码错误 处理文本文件的最佳实践 默认编码的陷阱和标准 I/O 的问题 规范化 Unicode 文本&#xff0c;进行安全的…...

通过Arduino IDE向闪存文件系统上传文件

注意&#xff1a;适用于Arduino IDE 2.0版本以上。对于Arduino IDE版本在2.0以下的请参考太极创客的教程&#xff1a;http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/spiffs/upload-files/。 1. 下载脚本文件 下载地址&#xff1a;https://github.com/earl…...

leetcode 121. Best Time to Buy and Sell Stock

题目描述 本题属于动态规划类问题。 dp数组的含义 dp[i][0]表示从第0天到第i天为止&#xff0c;处于持有股票的状态下&#xff0c;账户里的最大金额。 dp[i][1]表示从第0天到第i天为止&#xff0c;处于不持有股票的状态下&#xff0c;账户里的最大金额。 按照这个定义dp[n-…...

【Docker-13】Docker Container容器

Docker Container&#xff08;容器&#xff09; 一、什么是容器&#xff1f; 通俗地讲&#xff0c;容器是镜像的运行实体。镜像是静态的只读文件&#xff0c;而容器带有运行时需要的可写文件层&#xff0c;并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有…...

LoadableTransportInfo函数分析之RPCRT4!LOADABLE_TRANSPORT::LOADABLE_TRANSPORT初始化过程

LoadableTransportInfo函数分析 第一部分&#xff1a; RPC_STATUS LoadableTransportInfo ( IN RPC_CHAR * DllName, IN RPC_CHAR PAPI * RpcProtocolSequence, OUT TRANS_INFO * PAPI *pTransInfo ) { 。。。。。。。 pTransportInterface (*TransportLo…...

大模型预标注和自动化标注在OCR标注场景的应用

OCR&#xff0c;即光学字符识别&#xff0c;简单来说就是利用光学设备去捕获图像并识别文字&#xff0c;最终将图片中的文字转换为可编辑和可搜索的文本。在数字化时代&#xff0c;OCR&#xff08;光学字符识别&#xff09;技术作为处理图像中文字信息的关键手段&#xff0c;其…...