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

WinForm之ListView 组件

在 WinForm 中,ListView是用于展示列表型数据的灵活控件,支持多种视图模式(如详情列表、图标、列表等),可展示带有图标、多列属性的项目(如文件列表、产品信息),兼具展示和交互功能,是介于ListBox(单列表)和DataGridView(复杂表格)之间的中间层控件。

一、控件核心特点与视图模式

ListView的核心优势是多视图支持轻量的多列展示,主要视图模式(通过View属性设置)如下:

视图模式(View特点描述适用场景
Details多列详情视图(带列标题),可显示项目的多个属性(如名称、大小、日期)文件管理器、产品列表(需多属性展示)
LargeIcon大图标视图,每个项目显示大图标和文本,图标下方显示文字图片浏览、应用程序列表(突出图标)
SmallIcon小图标视图,图标和文本在同一行,横向排列紧凑的图标列表(如资源管理器 “列表” 视图)
List列表视图,无图标(或小图标),纵向排列,不支持列标题简单文本列表(如日志条目)
Tiletile 视图,图标和文本横向排列,可显示多个子项信息(类似 Windows “平铺” 视图)兼顾图标和多属性的展示(如音乐列表)

二、核心属性与事件(表格整理)

类别名称说明
数据与视图View视图模式(Details/LargeIcon等,见上表)
Items项目集合(ListViewItemCollection),通过Add()添加项目
Columns列标题集合(ListView.ColumnHeaderCollection),仅Details视图可见
SmallImageList关联的小图标集合(ImageList),用于SmallIcon/Details视图
LargeImageList关联的大图标集合(ImageList),用于LargeIcon/Tile视图
交互控制MultiSelect是否允许选择多个项目(默认true
SelectionMode选择模式(One单选 /MultiSimple简单多选 /MultiExtended扩展多选)
CheckBoxes是否在项目前显示复选框(默认false,用于批量选择)
FullRowSelectDetails视图中是否整行选中(默认falsetrue时点击任意列选中整行)
AllowColumnReorder是否允许用户拖动列标题调整列顺序(默认false
核心事件SelectedIndexChanged选中项目变化时触发(获取选中项)
ItemActivate激活项目时触发(双击项目或按 Enter,类似 “打开” 操作)
ColumnClick点击列标题时触发(用于按列排序)
ItemCheck复选框状态变化时触发(用于批量选择处理)

三、基础用法示例(详情视图展示文件列表)

场景:以详情视图展示文件信息(名称、大小、修改日期),支持选中和双击打开。

五种图模式

添加成员(一般情况ListView组件都是和其它控件一起使用,这里使用imageList)

这是编辑项

如果为空,就说明你没有提前创建提前组件,需要手动添加

创建imageList之后

在对应属性下,进行选中

然后再设置就可以选择对应内容了

就出现其中内容了

也可以添加表格,

直接编辑列

先编辑项,才能编辑列

修改对应文本内容就可以了,或者直接导入对应项

1. 界面设计

在窗体中添加:

  • ListView控件(命名为listView1);

  • ImageList控件 2 个(smallImageList用于小图标,largeImageList用于大图标,添加文件 / 文件夹图标);

  • Label控件(lblStatus显示选中状态)。

2. 代码实现
using System;
using System.IO;
using System.Windows.Forms;
​
namespace ListViewDemo
{public partial class Form1 : Form{public Form1(){InitializeComponent();// 初始化ListViewInitListView();// 加载文件数据LoadFileData();}
​private void InitListView(){// 1. 设置视图为详情模式listView1.View = View.Details;
​// 2. 添加列标题(名称、大小、修改日期)listView1.Columns.Add("名称", 200);       // 列宽200listView1.Columns.Add("大小", 100);       // 列宽100listView1.Columns.Add("修改日期", 150);   // 列宽150
​// 3. 关联图标(小图标用于详情视图)listView1.SmallImageList = smallImageList;// 4. 允许整行选中、多选、列重排listView1.FullRowSelect = true;listView1.MultiSelect = true;listView1.AllowColumnReorder = true;}
​// 加载文件夹中的文件数据private void LoadFileData(){string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); // 桌面路径if (Directory.Exists(path)){// 获取桌面文件string[] files = Directory.GetFiles(path);foreach (string file in files){FileInfo fi = new FileInfo(file);// 创建ListView项目(主项为文件名)ListViewItem item = new ListViewItem(fi.Name);// 设置图标(0:文件图标,假设smallImageList中索引0为文件图标)item.ImageIndex = 0;// 添加子项(大小、修改日期)item.SubItems.Add(fi.Length + " 字节");item.SubItems.Add(fi.LastWriteTime.ToString("yyyy-MM-dd HH:mm"));// 添加到ListViewlistView1.Items.Add(item);}}}
​// 选中项目变化时更新状态private void listView1_SelectedIndexChanged(object sender, EventArgs e){if (listView1.SelectedItems.Count > 0){lblStatus.Text = $"选中 {listView1.SelectedItems.Count} 个项目,第一个:{listView1.SelectedItems[0].Text}";}else{lblStatus.Text = "未选中项目";}}
​// 双击项目触发“打开”操作private void listView1_ItemActivate(object sender, EventArgs e){if (listView1.SelectedItems.Count > 0){string fileName = listView1.SelectedItems[0].Text;MessageBox.Show($"打开文件:{fileName}");}}}
}

四、进阶用法与场景

1. 切换视图模式(通过按钮切换图标 / 详情视图)
// 按钮:切换为大图标视图
private void btnLargeIcon_Click(object sender, EventArgs e)
{listView1.View = View.LargeIcon;listView1.LargeImageList = largeImageList; // 关联大图标
}
​
// 按钮:切换为详情视图
private void btnDetails_Click(object sender, EventArgs e)
{listView1.View = View.Details;listView1.SmallImageList = smallImageList; // 关联小图标
}
2. 按列排序(点击列标题排序)

ColumnClick事件中实现按列排序(需自定义排序逻辑):

// 排序依据的列索引和排序方向
private int sortColumn = 0;
private SortOrder sortOrder = SortOrder.None;
​
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{// 若点击当前排序列,切换排序方向if (e.Column == sortColumn){sortOrder = sortOrder == SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending;}else{// 点击新列,默认升序sortColumn = e.Column;sortOrder = SortOrder.Ascending;}
​// 执行排序(使用ListViewItemSorter)listView1.ListViewItemSorter = new ListViewItemComparer(sortColumn, sortOrder);listView1.Sort(); // 触发排序
}
​
// 自定义排序器(实现IComparer接口)
public class ListViewItemComparer : System.Collections.IComparer
{private int column;private SortOrder order;
​public ListViewItemComparer(int column, SortOrder order){this.column = column;this.order = order;}
​public int Compare(object x, object y){ListViewItem itemX = x as ListViewItem;ListViewItem itemY = y as ListViewItem;
​// 比较列内容(根据列类型处理,如数字、日期)int result = string.Compare(itemX.SubItems[column].Text, itemY.SubItems[column].Text);
​// 根据排序方向返回结果return order == SortOrder.Descending ? -result : result;}
}
3. 复选框批量操作(如批量删除)

启用CheckBoxes后,通过ItemCheck事件或按钮触发批量处理:

// 初始化时启用复选框
listView1.CheckBoxes = true;
​
// 批量删除按钮点击事件
private void btnDeleteSelected_Click(object sender, EventArgs e)
{// 收集所有勾选的项目foreach (ListViewItem item in listView1.Items){if (item.Checked){// 执行删除逻辑(如从列表中移除)// ...}}// 刷新列表listView1.Refresh();
}
4. 动态调整列宽自适应内容

让列宽自动适应内容(表头 + 单元格):

// 按钮:列宽自适应
private void btnAutoFitColumns_Click(object sender, EventArgs e)
{// 自适应所有列(包括表头和内容)listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); // 仅内容// 或:listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); // 仅表头// 或:listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.None); // 手动设置
}

五、常见问题与解决方案

1. 子项(SubItems)不显示
  • 原因:仅Details视图显示SubItems,且需先添加Columns(列标题数量需≥子项数量)。

  • 解决:设置View = View.Details,并确保Columns数量与SubItems匹配(如 3 列对应 2 个子项,主项 + 2 个子项)。

2. 图标不显示
  • 原因:未关联ImageList,或ImageIndex超出ImageList的图标索引范围。

  • 解决:为SmallImageList/LargeImageList赋值,并确保item.ImageIndex在有效范围内(如ImageList有 2 个图标,索引 0 和 1)。

3. 选中项目获取不到
  • 原因SelectionMode设置为None,或未在SelectedIndexChanged事件中处理。

  • 解决

    :设置SelectionMode = SelectionMode.One或MultiSimple,通过listView1.SelectedItems

    获取选中项:

    foreach (ListViewItem item in listView1.SelectedItems)
    {string text = item.Text; // 主项文本string subText = item.SubItems[1].Text; // 子项文本
    }
4. 大量数据加载卡顿
  • 原因:一次性添加大量ListViewItem会阻塞 UI 线程。

  • 解决

    :使用BeginUpdate()和EndUpdate()

    减少刷新次数:

    listView1.BeginUpdate(); // 开始批量更新(暂停绘制)
    foreach (var data in largeDataList)
    {listView1.Items.Add(new ListViewItem(data));
    }
    listView1.EndUpdate(); // 结束更新(恢复绘制)

六、与DataGridView/ListBox的对比

控件优势场景局限性
ListView多视图展示(图标 / 列表 / 详情)、轻量多列展示编辑功能弱(无单元格编辑),不支持复杂数据绑定
DataGridView复杂表格编辑、数据绑定、单元格级控制视图模式固定(仅表格),资源占用较高
ListBox简单单列表展示、节省资源不支持多列和图标,功能单一

七、适用场景总结

场景类型推荐视图 / 设置示例
文件管理器列表Details视图 + 图标 + 列排序模拟资源管理器的文件列表(名称 / 大小 / 日期)
图片 / 产品缩略图浏览LargeIconTile视图 + 大图标相册图片预览、商品缩略图列表
批量选择操作列表Details+CheckBoxes+ 全选按钮邮件列表(批量删除 / 标记)、订单批量处理
轻量多属性数据展示Details视图 + 列宽自适应日志列表(时间 / 级别 / 内容)、用户信息简表

总结

ListView是兼顾展示灵活性和轻量特性的列表控件,其核心价值在于多视图支持和简洁的多列展示。通过Details视图可实现类似表格的多属性展示,通过图标视图可突出视觉信息,适合文件管理、图片浏览等场景。相比DataGridView,它更轻量但编辑功能较弱;相比ListBox,它支持多列和图标,功能更丰富。使用时需注意视图模式与数据结构的匹配,以及大量数据加载时的性能优化。

http://www.lryc.cn/news/611479.html

相关文章:

  • Ethereum: L1 与 L2 的安全纽带, Rollups 技术下的协作与区别全解析
  • Vue计算属性详解2
  • 无法解析 CentOS 官方镜像源的域名
  • 微软的BitLocker加密
  • 输电线路防外破声光预警装置 | 防山火/防钓鱼/防施工安全警示系统
  • 豆包新模型与PromptPilot工具深度测评:AI应用开发的全流程突破
  • UE编辑器相机窗口运行时相机fov 大小不一致
  • 嵌入式学习的第四十四天-ARM
  • 安装 cuda 版本 PyTorch(2025)
  • 【计算机网络】王道考研笔记整理(3)数据链路层
  • Python 通过Playwright+OpenCV破解滑动验证码 实例
  • 企业级MCP部署实战:从开发到生产的完整DevOps流程
  • 007 前端( JavaScript HTML DOM+Echarts)
  • 深入浅出 RabbitMQ - 主题模式(Topic)
  • 计算机网络:一个 IP 地址可以同时属于 A 类、B 类或 C 类吗?
  • 计算机视觉的四项基本任务辨析
  • 力扣148:排序链表
  • # Kafka 消费堆积:从现象到解决的全链路分析
  • VUE+SPRINGBOOT从0-1打造前后端-前后台系统-邮箱重置密码
  • python-自定义抠图
  • Python日志记录库——logaid
  • mq_unlink系统调用及示例
  • RC和RR的区别
  • 一文搞定JavaServerPages基础,从0开始写一个登录与人数统计页面
  • Python 函数详解
  • SpringCloud学习------Hystrix详解
  • 通俗版23种设计模式解析
  • 苍穹外卖Day10
  • 智慧酒店:科技赋能下的未来住宿新体验
  • Datawhale AI夏令营 第三期 task2 稍微改进