位置: 文档库 > C#(.NET) > C# ListView用法详解

C# ListView用法详解

坚如磐石 上传于 2022-03-27 10:18

《C# ListView用法详解》

在C# Windows Forms应用程序开发中,ListView控件是展示列表数据、树形结构或图标集合的核心组件。它不仅支持简单的文本列表,还能通过多种视图模式(大图标、小图标、列表、详细信息)灵活呈现数据,结合分组、排序、自定义绘制等功能,可构建出功能丰富的用户界面。本文将系统讲解ListView的常用功能、核心属性及代码实现,帮助开发者快速掌握其用法。

一、ListView基础与视图模式

ListView控件位于System.Windows.Forms命名空间,通过设置View属性可切换四种视图模式:

  • View.LargeIcon:大图标模式,每个项显示为完整图标和标签
  • View.SmallIcon:小图标模式,图标较小且标签在右侧
  • View.List:列表模式,单列显示文本,无图标
  • View.Details:详细信息模式,支持多列显示,可自定义列标题
// 创建ListView并设置视图模式
ListView listView = new ListView();
listView.View = View.Details; // 常用详细信息模式
listView.Dock = DockStyle.Fill;
this.Controls.Add(listView);

二、添加列与数据项

在详细信息模式下,需先通过Columns集合添加列,再通过Items集合添加数据项。每个项可包含子项(SubItem)用于多列数据。

// 添加列
listView.Columns.Add("姓名", 100, HorizontalAlignment.Left);
listView.Columns.Add("年龄", 80, HorizontalAlignment.Center);
listView.Columns.Add("职业", 150, HorizontalAlignment.Left);

// 添加数据项
ListViewItem item1 = new ListViewItem("张三");
item1.SubItems.Add("28");
item1.SubItems.Add("工程师");

ListViewItem item2 = new ListViewItem("李四");
item2.SubItems.Add("32");
item2.SubItems.Add("设计师");

listView.Items.AddRange(new ListViewItem[] { item1, item2 });

三、数据绑定与动态更新

ListView支持通过DataSource属性绑定数据源(如List、DataTable),需配合ListView.ListViewItemSorter实现排序。

// 数据绑定示例
List persons = new List
{
    new Person { Name = "王五", Age = 25, Job = "教师" },
    new Person { Name = "赵六", Age = 30, Job = "医生" }
};

listView.Items.Clear();
foreach (var person in persons)
{
    ListViewItem item = new ListViewItem(person.Name);
    item.SubItems.Add(person.Age.ToString());
    item.SubItems.Add(person.Job);
    listView.Items.Add(item);
}

// 自定义排序类
public class ListViewItemComparer : IComparer
{
    private int col;
    private SortOrder order;

    public ListViewItemComparer(int column, SortOrder order)
    {
        col = column;
        this.order = order;
    }

    public int Compare(object x, object y)
    {
        int result = String.Compare(((ListViewItem)x).SubItems[col].Text, 
                                   ((ListViewItem)y).SubItems[col].Text);
        return (order == SortOrder.Ascending) ? result : -result;
    }
}

// 点击列标题排序
listView.ColumnClick += (sender, e) =>
{
    if (listView.Sorting == SortOrder.Ascending)
        listView.Sorting = SortOrder.Descending;
    else
        listView.Sorting = SortOrder.Ascending;

    listView.ListViewItemSorter = new ListViewItemComparer(e.Column, listView.Sorting);
    listView.Sort();
};

四、分组功能实现

通过Groups集合可将项分组显示,增强数据可读性。

// 创建分组
ListViewGroup group1 = new ListViewGroup("技术部", HorizontalAlignment.Left);
ListViewGroup group2 = new ListViewGroup("市场部", HorizontalAlignment.Left);

listView.Groups.AddRange(new ListViewGroup[] { group1, group2 });

// 将项添加到分组
item1.Group = group1;
item2.Group = group2;

// 动态分组示例(按职业分组)
foreach (ListViewItem item in listView.Items)
{
    string job = item.SubItems[2].Text;
    ListViewGroup existingGroup = listView.Groups.Cast()
        .FirstOrDefault(g => g.Header == job);

    if (existingGroup == null)
    {
        existingGroup = new ListViewGroup(job);
        listView.Groups.Add(existingGroup);
    }
    item.Group = existingGroup;
}

五、自定义绘制与样式

通过OwnerDraw属性启用自定义绘制,重写OnDrawItem和OnDrawSubItem事件可实现个性化样式。

// 启用自定义绘制
listView.OwnerDraw = true;

// 自定义绘制事件
listView.DrawItem += (sender, e) =>
{
    e.DrawBackground();
    e.DrawText();
};

listView.DrawSubItem += (sender, e) =>
{
    // 根据条件设置不同背景色
    if (e.ItemIndex % 2 == 0)
        e.Graphics.FillRectangle(Brushes.LightBlue, e.Bounds);
    else
        e.Graphics.FillRectangle(Brushes.White, e.Bounds);

    TextRenderer.DrawText(e.Graphics, e.SubItem.Text, 
                         e.Item.Font, e.Bounds, e.ForeColor, 
                         TextFormatFlags.VerticalCenter | TextFormatFlags.Left);
};

// 禁用默认绘制(避免重复绘制)
listView.DrawColumnHeader += (sender, e) =>
{
    using (SolidBrush brush = new SolidBrush(SystemColors.ControlDark))
    {
        e.Graphics.FillRectangle(brush, e.Bounds);
    }
    TextRenderer.DrawText(e.Graphics, listView.Columns[e.ColumnIndex].Text, 
                         e.Font, e.Bounds, Color.White, 
                         TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter);
};

六、常用属性与方法

ListView的核心属性与方法:

  • MultiSelect:是否允许多选(默认true)
  • CheckBoxes:是否显示复选框
  • FullRowSelect:是否全行选中(详细信息模式下有效)
  • GridLines:是否显示网格线(详细信息模式下)
  • SelectedItems:获取选中的项集合
  • FindItemWithText():按文本查找项
// 示例:获取选中项并显示信息
if (listView.SelectedItems.Count > 0)
{
    ListViewItem selectedItem = listView.SelectedItems[0];
    MessageBox.Show($"选中:{selectedItem.Text},职业:{selectedItem.SubItems[2].Text}");
}

// 查找包含"工程师"的项
ListViewItem foundItem = listView.FindItemWithText("工程师", false, 0, true);
if (foundItem != null)
{
    foundItem.Selected = true;
    foundItem.EnsureVisible();
}

七、性能优化技巧

当处理大量数据时,需注意以下优化:

  1. 使用BeginUpdate()/EndUpdate()避免频繁重绘
  2. 虚拟模式(VirtualMode)处理超大数据集
  3. 禁用不必要的视觉效果(如GridLines)
// 批量添加数据时的优化
listView.BeginUpdate();
try
{
    for (int i = 0; i 
{
    e.Item = new ListViewItem($"虚拟项{e.ItemIndex}");
    e.Item.SubItems.Add((e.ItemIndex % 50).ToString());
};

八、完整示例:带分组的员工列表

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
        InitializeListView();
    }

    private void InitializeListView()
    {
        ListView listView = new ListView
        {
            View = View.Details,
            Dock = DockStyle.Fill,
            FullRowSelect = true,
            GridLines = true,
            Sorting = SortOrder.Ascending
        };

        // 添加列
        listView.Columns.Add("ID", 50, HorizontalAlignment.Center);
        listView.Columns.Add("姓名", 100, HorizontalAlignment.Left);
        listView.Columns.Add("部门", 120, HorizontalAlignment.Left);
        listView.Columns.Add("入职日期", 120, HorizontalAlignment.Center);

        // 添加分组
        ListViewGroup devGroup = new ListViewGroup("开发部");
        ListViewGroup hrGroup = new ListViewGroup("人力资源部");
        listView.Groups.AddRange(new ListViewGroup[] { devGroup, hrGroup });

        // 添加测试数据
        AddEmployee(listView, "E001", "张三", "开发部", "2020-05-10", devGroup);
        AddEmployee(listView, "E002", "李四", "人力资源部", "2019-08-15", hrGroup);
        AddEmployee(listView, "E003", "王五", "开发部", "2021-03-22", devGroup);

        // 排序事件
        listView.ColumnClick += (sender, e) =>
        {
            if (listView.Sorting == SortOrder.Ascending)
                listView.Sorting = SortOrder.Descending;
            else
                listView.Sorting = SortOrder.Ascending;

            listView.ListViewItemSorter = new ListViewItemComparer(e.Column, listView.Sorting);
            listView.Sort();
        };

        this.Controls.Add(listView);
    }

    private void AddEmployee(ListView listView, string id, string name, string dept, string date, ListViewGroup group)
    {
        ListViewItem item = new ListViewItem(id);
        item.SubItems.Add(name);
        item.SubItems.Add(dept);
        item.SubItems.Add(date);
        item.Group = group;
        listView.Items.Add(item);
    }
}

// 排序比较器(需放在类外部)
public class ListViewItemComparer : IComparer
{
    private int col;
    private SortOrder order;

    public ListViewItemComparer(int column, SortOrder order)
    {
        col = column;
        this.order = order;
    }

    public int Compare(object x, object y)
    {
        ListViewItem itemX = x as ListViewItem;
        ListViewItem itemY = y as ListViewItem;

        string textX = itemX.SubItems[col].Text;
        string textY = itemY.SubItems[col].Text;

        // 尝试按日期排序(第4列)
        if (col == 3 && DateTime.TryParse(textX, out DateTime dateX) && 
            DateTime.TryParse(textY, out DateTime dateY))
        {
            int result = dateX.CompareTo(dateY);
            return (order == SortOrder.Ascending) ? result : -result;
        }

        // 默认字符串比较
        int stringResult = String.Compare(textX, textY);
        return (order == SortOrder.Ascending) ? stringResult : -stringResult;
    }
}

关键词C# ListView控件、视图模式、数据绑定、分组功能、自定义绘制、性能优化、VirtualMode、ListViewItemComparer

简介:本文详细讲解C#中ListView控件的用法,涵盖视图模式切换、数据项与列管理、数据绑定与排序、分组功能实现、自定义绘制技巧及性能优化方法,通过完整代码示例展示从基础到高级的应用场景,帮助开发者高效构建数据展示界面。