WinForm之ListView 组件_ListView控件增删改查操作
在 WinForm 中,ListView
是用于展示列表型数据的灵活控件,支持多种视图模式(如详情列表、图标、列表等),可展示带有图标、多列属性的项目(如文件列表、产品信息),兼具展示和交互功能,是介于ListBox
(单列表)和DataGridView
(复杂表格)之间的中间层控件。
一、控件核心特点与视图模式
ListView
的核心优势是多视图支持和轻量的多列展示,主要视图模式(通过View
属性设置)如下:
View
)Details
LargeIcon
SmallIcon
List
Tile
二、核心属性与事件(表格整理)
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
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
,它支持多列和图标,功能更丰富。使用时需注意视图模式与数据结构的匹配,以及大量数据加载时的性能优化。