WinForm之ListView 组件

发布于:2025-08-07 ⋅ 阅读:(11) ⋅ 点赞:(0)

在 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视图中是否整行选中(默认falsetrue时点击任意列选中整行)
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视图 + 图标 + 列排序 模拟资源管理器的文件列表(名称 / 大小 / 日期)
图片 / 产品缩略图浏览 LargeIconTile视图 + 大图标 相册图片预览、商品缩略图列表
批量选择操作列表 Details+CheckBoxes+ 全选按钮 邮件列表(批量删除 / 标记)、订单批量处理
轻量多属性数据展示 Details视图 + 列宽自适应 日志列表(时间 / 级别 / 内容)、用户信息简表

总结

ListView是兼顾展示灵活性和轻量特性的列表控件,其核心价值在于多视图支持和简洁的多列展示。通过Details视图可实现类似表格的多属性展示,通过图标视图可突出视觉信息,适合文件管理、图片浏览等场景。相比DataGridView,它更轻量但编辑功能较弱;相比ListBox,它支持多列和图标,功能更丰富。使用时需注意视图模式与数据结构的匹配,以及大量数据加载时的性能优化。


网站公告

今日签到

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