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

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

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

相关文章:

  • Work Experience
  • java相关技术总结
  • 在 openEuler 24.03 (LTS) 操作系统上添加 ollama 作为系统服务的步骤
  • 如何在Android系统上单编ko?
  • c++基础知识二
  • 剑指offer经典题目(三)
  • 基于springboot的“协同过滤算法的高考择校推荐系统”的设计与实现(源码+数据库+文档+PPT)
  • 使用模板报错:_G.unicode.len(orgline.text_stripped:gsub(“ “,““))
  • JavaScript保留小数位及提示toFixed未定义
  • 解决文件夹解压中文字符产生乱码的问题
  • SQLI漏洞公开报告分析
  • JS 数组解构
  • 无人机飞控的二次开发,视觉定位
  • 空杯见月,满杯见己
  • 全文 - MLIR Toy Tutorial Chapter 4: 使用 interfaces 开启 通用变换
  • C++怎么调用类中的函数
  • 阿里云CDN应对DDoS攻击策略
  • #苍穹外卖#(个人使用)
  • MyBatis-Plus 的 FieldStrategy 属性
  • 2025年危化品安全管理人员备考指南|智能题库+核心考点解析