在 WinForm 中,ListView
是用于展示列表型数据 的灵活控件,支持多种视图模式(如详情列表、图标、列表等),可展示带有图标、多列属性的项目(如文件列表、产品信息),兼具展示和交互功能,是介于ListBox
(单列表)和DataGridView
(复杂表格)之间的中间层控件。
一、控件核心特点与视图模式
ListView
的核心优势是多视图支持 和轻量的多列展示 ,主要视图模式(通过View
属性设置)如下:
视图模式(View ) |
特点描述 | 适用场景 |
---|---|---|
Details |
多列详情视图(带列标题),可显示项目的多个属性(如名称、大小、日期) | 文件管理器、产品列表(需多属性展示) |
LargeIcon |
大图标视图,每个项目显示大图标和文本,图标下方显示文字 | 图片浏览、应用程序列表(突出图标) |
SmallIcon |
小图标视图,图标和文本在同一行,横向排列 | 紧凑的图标列表(如资源管理器 "列表" 视图) |
List |
列表视图,无图标(或小图标),纵向排列,不支持列标题 | 简单文本列表(如日志条目) |
Tile |
tile 视图,图标和文本横向排列,可显示多个子项信息(类似 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 ,用于批量选择) |
|
FullRowSelect |
在Details 视图中是否整行选中(默认false ,true 时点击任意列选中整行) |
|
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();
// 初始化ListView
InitListView();
// 加载文件数据
LoadFileData();
}
private void InitListView()
{
// 1. 设置视图为详情模式
listView1.View = View.Details;
// 2. 添加列标题(名称、大小、修改日期)
listView1.Columns.Add("名称", 200); // 列宽200
listView1.Columns.Add("大小", 100); // 列宽100
listView1.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"));
// 添加到ListView
listView1.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 视图 + 图标 + 列排序 |
模拟资源管理器的文件列表(名称 / 大小 / 日期) |
图片 / 产品缩略图浏览 | LargeIcon 或Tile 视图 + 大图标 |
相册图片预览、商品缩略图列表 |
批量选择操作列表 | Details +CheckBoxes + 全选按钮 |
邮件列表(批量删除 / 标记)、订单批量处理 |
轻量多属性数据展示 | Details 视图 + 列宽自适应 |
日志列表(时间 / 级别 / 内容)、用户信息简表 |
总结
ListView
是兼顾展示灵活性和轻量特性的列表控件,其核心价值在于多视图支持和简洁的多列展示。通过Details
视图可实现类似表格的多属性展示,通过图标视图可突出视觉信息,适合文件管理、图片浏览等场景。相比DataGridView
,它更轻量但编辑功能较弱;相比ListBox
,它支持多列和图标,功能更丰富。使用时需注意视图模式与数据结构的匹配,以及大量数据加载时的性能优化。