C# ListView用法详解
《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();
}
七、性能优化技巧
当处理大量数据时,需注意以下优化:
- 使用BeginUpdate()/EndUpdate()避免频繁重绘
- 虚拟模式(VirtualMode)处理超大数据集
- 禁用不必要的视觉效果(如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控件的用法,涵盖视图模式切换、数据项与列管理、数据绑定与排序、分组功能实现、自定义绘制技巧及性能优化方法,通过完整代码示例展示从基础到高级的应用场景,帮助开发者高效构建数据展示界面。