一、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,可高效实现文件管理、报表生成等需求。开发者需结合场景选择控件,并注意性能优化与交互逻辑的完善。