基于您提供的参考材料,C# 中 `ListView` 与 `ListViewItem` 的核心用法是通过 `ListView` 控件展示结构化数据,而 `ListViewItem` 则代表了其中的一行或一项。其基本流程包括:创建列(`ColumnHeader`)、设置视图模式、以及创建和添加数据行(`ListViewItem`)。以下是详细的用法和代码示例。
### 核心概念与基本用法
| 组件/概念 | 描述 | 关键属性/方法 |
| :--- | :--- | :--- |
| **ListView 控件** | 用于在 Windows 窗体中以多种视图(列表、图标、详细信息等)显示项目的列表控件。 | `View` (设置视图模式), `Columns` (列集合), `Items` (数据项集合), `FullRowSelect`, `GridLines` |
| **ListViewItem** | 代表 `ListView` 控件中的一个项,在 `Details` 视图中,一个项通常对应一行数据。 | `Text` (主项文本), `SubItems` (子项集合), `ImageIndex` |
| **ColumnHeader** | 在 `Details` 视图中定义列的标题。 | `Text` (列标题文本), `Width` |
### 基础操作示例代码
以下代码演示了如何在 Windows 窗体应用程序中初始化一个 `ListView`,添加列,并动态添加和删除数据行。
```csharp
// 假设此代码位于某个窗体(如 Form1)的 Load 事件或构造函数中
private void InitializeListView()
{
// 1. 设置 ListView 的基本属性
listView1.View = View.Details; // 设置为“详细信息”视图,以显示多列数据 [ref_2][ref_3]
listView1.GridLines = true; // 显示网格线 [ref_4][ref_6]
listView1.FullRowSelect = true; // 单击时选中整行,而非第一列
// 2. 创建列头 (ColumnHeader)
listView1.Columns.Add("姓名", 100, HorizontalAlignment.Left); // 添加列,参数:列标题、宽度、对齐方式 [ref_1][ref_2]
listView1.Columns.Add("年龄", 70, HorizontalAlignment.Center);
listView1.Columns.Add("城市", 150, HorizontalAlignment.Left);
// 3. 创建并添加 ListViewItem(数据行)
// 方法一:先创建 ListViewItem,再添加子项 (SubItems)
ListViewItem item1 = new ListViewItem("张三"); // 构造函数的参数是该项第一列(姓名列)的文本 [ref_1][ref_5]
item1.SubItems.Add("28"); // 为第二列(年龄列)添加子项 [ref_1][ref_4]
item1.SubItems.Add("北京"); // 为第三列(城市列)添加子项
listView1.Items.Add(item1); // 将项目添加到 ListView 中 [ref_1]
// 方法二:使用数组一次性创建 ListViewItem 及其子项
ListViewItem item2 = new ListViewItem(new string[] { "李四", "35", "上海" }); // 数组元素依次对应各列 [ref_5]
listView1.Items.Add(item2);
// 运行后,ListView 将显示两行数据。
}
```
### 动态增删数据行示例
通常,数据操作会通过按钮等控件触发。
```csharp
// “添加”按钮的点击事件处理
private void btnAdd_Click(object sender, EventArgs e)
{
// 假设从文本框 txtName, txtAge, txtCity 获取输入
string name = txtName.Text;
string age = txtAge.Text;
string city = txtCity.Text;
if (!string.IsNullOrEmpty(name))
{
// 创建新的数据项
ListViewItem newItem = new ListViewItem(new string[] { name, age, city }); // [ref_5]
listView1.Items.Add(newItem); // 添加到 ListView [ref_1]
// 清空输入框,准备下一次输入
txtName.Clear();
txtAge.Clear();
txtCity.Clear();
}
}
// “删除”按钮的点击事件处理
private void btnDelete_Click(object sender, EventArgs e)
{
// 检查是否有选中的项
if (listView1.SelectedItems.Count > 0)
{
// 移除当前选中的第一项(允许多选,这里处理第一个)
listView1.Items.Remove(listView1.SelectedItems[0]); // [ref_1][ref_5]
}
else
{
MessageBox.Show("请先选择要删除的行。");
}
}
// “清空”按钮的点击事件处理
private void btnClear_Click(object sender, EventArgs e)
{
listView1.Items.Clear(); // 清空所有数据项 [ref_2]
}
```
### 自定义显示与高级功能
#### 1. 设置单元格颜色和字体
可以修改 `ListViewItem` 及其 `SubItems` 的样式。
```csharp
private void SetItemStyle()
{
if (listView1.Items.Count > 0)
{
ListViewItem item = listView1.Items[0]; // 获取第一项
item.BackColor = Color.LightYellow; // 设置整行的背景色 [ref_4]
// 设置特定子项(单元格)的样式,例如第二列(年龄)
if (item.SubItems.Count > 1) // 确保存在子项
{
item.SubItems[1].BackColor = Color.Cyan; // 设置年龄单元格的背景色 [ref_4]
item.SubItems[1].ForeColor = Color.Red; // 设置年龄单元格的字体颜色 [ref_6]
item.SubItems[1].Font = new Font("微软雅黑", 10, FontStyle.Bold); // 设置字体
}
}
}
```
#### 2. 多种视图模式
`ListView.View` 属性支持多种视图,适用于不同场景 [ref_2]。
```csharp
// 可以通过单选按钮或下拉菜单切换视图
private void ChangeViewMode(View mode)
{
listView1.View = mode; // [ref_2]
}
// 调用示例:
// ChangeViewMode(View.LargeIcon); // 大图标
// ChangeViewMode(View.SmallIcon); // 小图标
// ChangeViewMode(View.List); // 列表(单列)
// ChangeViewMode(View.Details); // 详细信息(多列,最常用)
// ChangeViewMode(View.Tile); // 平铺 (Windows XP及以上)
```
#### 3. 虚拟模式处理大量数据
当需要显示成千上万行数据时,直接添加 `ListViewItem` 会消耗大量内存。虚拟模式通过按需提供数据来解决此问题 [ref_1][ref_5]。
```csharp
private void EnableVirtualMode()
{
// 假设有一个包含大量数据的 List<Person> dataSource
List<Person> hugeDataList = GetHugeData(); // 获取大数据源
listView1.VirtualMode = true; // 启用虚拟模式 [ref_1]
listView1.VirtualListSize = hugeDataList.Count; // 设置虚拟列表的总项数 [ref_1]
// 处理 RetrieveVirtualItem 事件,ListView 在需要显示某项时触发此事件
listView1.RetrieveVirtualItem += (sender, e) =>
{
int index = e.ItemIndex;
if (index >= 0 && index < hugeDataList.Count)
{
Person p = hugeDataList[index];
// 动态创建 ListViewItem
e.Item = new ListViewItem(new string[] { p.Name, p.Age.ToString(), p.City }); // [ref_1]
}
};
// 处理 CacheVirtualItems 事件可以优化性能,缓存一定范围的数据
listView1.CacheVirtualItems += (sender, e) =>
{
// 根据 e.StartIndex 和 e.EndIndex 更新缓存逻辑
};
}
```
### 总结
`ListView` 与 `ListViewItem` 是 C# WinForms 中展示列表数据的核心控件。基础使用遵循“设置视图 -> 定义列 -> 添加项”的流程 [ref_3]。通过操作 `ListView.Items` 集合和 `ListViewItem.SubItems` 集合,可以灵活地进行数据的增删改查和样式定制 [ref_4][ref_6]。对于性能要求高的大数据集,应使用虚拟模式来动态提供数据 [ref_1][ref_5]。在实际开发中,结合数据绑定或 MVC/MVP 模式,可以构建出更清晰、更易于维护的数据展示界面。