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

发布于:2025-04-15 ⋅ 阅读:(32) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到