一ListViewlistView的五个视图模式模式名称形象比喻适用场景图标要求Details(详细)Excel 表格最常用显示多列数据如姓名、年龄、日期。使用SmallImageListLargeIcon(大图标)桌面图标像 Windows 桌面那样大图配下面一行字。使用LargeImageListSmallIcon(小图标)控制面板左右排列的小图标文字在图标右边。使用SmallImageListList(列表)垂直名单只有一列数据自上而下排列。使用SmallImageListTile(平铺)卡片较大的图标右侧显示多行简短信息。通常用 Small/Medium二常用属性三常用事件一、高频事件★★★★★ / ★★★★☆开发必用90% 的业务场景都会用到必须优先掌握。1.SelectedIndexChanged触发时机ListView 的选中项高亮发生改变时单选 / 多选、取消选中都会触发核心作用获取当前选中的项执行选中后的业务逻辑常用场景选中列表项后显示详情、启用 / 禁用功能按钮、加载对应子数据频次★★★★★最高频无之一小贴士多选时会多次触发建议加if(listView1.SelectedItems.Count 0)避免空值报错。2.ItemActivate触发时机用户双击列表项或 按Enter 键激活选中项时触发核心作用处理项的「激活操作」打开、编辑、查看详情常用场景双击列表项打开详情窗口、编辑数据频次★★★★★第二高频优势比鼠标双击事件更适配 ListView仅点击项生效无需判断点击位置。3.ColumnClick触发时机点击列表列头时触发核心作用获取点击的列索引实现列表排序常用场景点击列头对数据升序 / 降序排序详情视图必备频次★★★★☆4.MouseClick触发时机鼠标左键 / 右键 / 中键点击 ListView任意位置时触发核心作用获取鼠标坐标、按钮类型实现精准点击逻辑常用场景弹出右键菜单、点击空白处取消选中频次★★★★☆对比比基础Click事件更强大带鼠标参数WinForm 开发优先用它。二、中频事件★★★☆☆特定场景常用开启复选框、编辑标签、键盘操作时必备。1.ItemChecked触发时机ListView复选框选中状态改变后触发核心作用获取所有勾选的项执行批量操作常用场景批量删除、批量选中、统计勾选数量频次★★★★☆复选框场景必用前提必须先设置listView1.CheckBoxes true。2.ItemCheck触发时机复选框选中状态改变前触发核心作用验证 / 取消勾选操作限制勾选数量、禁止勾选禁用项常用场景最多勾选 3 项、禁止勾选特定项频次★★★☆☆关键可通过e.NewValue CheckState.Unchecked强制取消勾选。3.MouseDoubleClick触发时机鼠标双击 ListView任意位置空白处也会触发核心作用自定义双击逻辑常用场景替代ItemActivate精准控制双击生效区域频次★★★☆☆推荐列表项激活优先用ItemActivate空白双击用此事件。4.BeforeLabelEdit/AfterLabelEdit触发时机列表项标签开始编辑前/编辑完成后核心作用限制编辑内容、保存修改后的文本常用场景允许用户直接修改列表项名称频次★★★☆☆前提必须先设置listView1.LabelEdit true。5.KeyDown触发时机键盘按键按下时触发核心作用处理键盘快捷键常用场景按Delete删除选中项、CtrlA全选频次★★★☆☆三、低频事件★★☆☆☆ 及以下极少使用仅自定义 UI、特殊布局需求时用到。1. 自定义绘制类DrawItem、DrawSubItem、DrawColumnHeader触发时机绘制项 / 子项 / 列头时触发核心作用自定义 ListView 外观改颜色、图标、样式场景美化界面、定制列表样式频次★★☆☆☆前提必须设置listView1.OwnerDraw true。2. 布局 / 状态类Layout、SizeChanged、Scroll、ItemHover触发时机布局改变、大小改变、滚动条滚动、鼠标悬停场景自适应布局、悬停提示、滚动监听频次★☆☆☆☆3. 验证类Validating、Validated触发时机控件验证时场景极少用于 ListView频次★☆☆☆☆4.易混淆事件对比事件组合核心区别SelectedIndexChangedvsItemChecked前者 高亮选中改变后者 复选框勾选改变完全独立ItemActivatevsMouseDoubleClick前者 仅双击项生效后者 双击任意位置生效推荐用前者ItemCheckvsItemChecked前者 勾选前可取消后者 勾选后仅处理结果多选场景下SelectedIndexChanged会多次触发务必加非空判断右键菜单必须用MouseClick事件判断e.Button MouseButtons.Right用复选框→开CheckBoxes true用标签编辑→开LabelEdit true自定义绘制→必须开OwnerDraw true否则绘制事件不生效。四常用代码操作在Details详细信息模式下ListView的操作主要围绕着“行Item”和“子项SubItem”展开。1. 添加数据最基础操作在ListView中每一行被称为一个ListViewItem。第一列是“本体”后面的列都是它的“子项”。方法1// 1. 创建一行并设置第一列的内容比如序号或姓名 ListViewItem item new ListViewItem(1); // 2. 给这一行添加后续列的数据 item.SubItems.Add(张三); // 第二列 item.SubItems.Add(25); // 第三列 // 3. 把这一行正式塞进控件里 listView1.Items.Add(item);方法2 字符串数组直接用字符串数组一次性创建所有列。listView1.View View.Details; listView1.Columns.Add(ID, 80); listView1.Columns.Add(姓名, 120); listView1.Columns.Add(年龄, 80); listView1.Items.Add(new ListViewItem(new[] {1,张飞,20}));方法3循环添加多行批量添加从数组、集合里循环加数据最常用listView1.View View.Details; listView1.Columns.Add(ID, 80); listView1.Columns.Add(姓名, 120); listView1.Columns.Add(年龄, 80); // 模拟多条数据 string[,] data { { 1, 张三, 20 }, { 2, 李四, 21 }, { 3, 王五, 22 } }; for (int i 0; i data.GetLength(0); i) { listView1.Items.Add(new ListViewItem(new[] { data[i,0], data[i,1], data[i,2] } )); }方法4 先创建 item再批量加入性能高先把所有行创建好最后一次性加入。ListListViewItem listItems new ListListViewItem(); listItems.Add(new ListViewItem(new[] { 2, 张三, 20 })); listItems.Add(new ListViewItem(new[] { 3, 张四, 22 })); //一次性加入 listView1.Items.AddRange(listItems.ToArray());//只接受数组✅ 数据量大时界面不卡顿方法5绑定对象集合高级用法项目最常用把自己的类如 User自动转成 ListView 行。public class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } // 模拟数据源 var users new ListUser { new User{Id1, Name张三, Age20}, new User{Id2, Name李四, Age21} }; // 绑定到 ListView foreach (var user in users) { // ✅ 用 ListViewItem 包装数组Add 方法就能正确识别了 listView1.Items.Add(new ListViewItem(new[] { user.Id.ToString(), user.Name, user.Age.ToString() })); }✅ 真正项目开发必用2.带图标添加如果你绑定了SmallImageList代码里只需要多传一个索引号// 参数1文字参数2ImageList 里的图片编号 (从 0 开始) ListViewItem item new ListViewItem(1, 0); item.SubItems.Add(李四); item.SubItems.Add(20); listView1.Items.Add(item);3. 获取用户选中的是哪一行当用户点击了某一行你可能想知道他选的是谁。注意ListView默认支持多选所以选中的结果是一个集合。// 判断用户是否真的选中了东西 if (listView1.SelectedItems.Count 0) { // 获取选中的第一行 ListViewItem selectedRow listView1.SelectedItems[0]; // 获取这一行的文字第一列 string id selectedRow.Text; // 获取第二列姓名 string name selectedRow.SubItems[1].Text; MessageBox.Show(你选中了 name); }4. 修改和删除数据修改直接定位到某一行进行赋值。// 把选中的那一行的姓名改掉 listView1.SelectedItems[0].SubItems[1].Text 王五;删除选中行foreach (ListViewItem item in listView1.SelectedItems) { listView1.Items.Remove(item); }清空全表listView1.Items.Clear();ListViewItem1.是什么ListViewItem是WinForms 里专门给ListView控件用的 “行对象”相当于ListView里的一行数据。它本身不是一个 “列表容器”而是用来表示列表里的单个条目。它的核心作用存这一行的主文本你代码里的文本存这一行的图标索引、子项SubItems、分组信息、状态选中 / 高亮等是ListView和它的数据行之间的桥梁2.本质ListViewItem是.NET系统提取写好的一个类它提取定义好了一堆属性专门用来存和ListView行相关的信息Text显示的文字ImageIndex图标索引SubItems多列数据Tag附加数据Font、ForeColor样式Group归属哪个分组它不负责存储整个列表只负责存储一行的所有信息。它不存储列表列表存在别的地方装所有行的容器是listView.Items装一行多列的容器是item.SubItemsUI框架交互与数据模型设计核心架构思想这是职业程序员的“基本功”。它讲究的是“分工明确”M (Model - 模型)就是你的User类。它只负责存数据不管界面长啥样。V (View - 视图)就是你的ListView。它只负责显示不存数据。C/VM (控制器/视图模型)就是你写的那些逻辑负责把模型里的数据“翻译”给视图看。为什么要分层假设哪天老板说“咱们不用ListView了换成别的控件。”如果你用了高级做法你只需要改“翻译”的那部分代码你的User类和业务逻辑完全不用动。特性普通做法 (手动改界面)高级做法 (数据驱动)工作量每次改数据都要手动改界面代码只管改数据界面自动更新准确性容易漏掉界面更新导致数据不一致仓库和货架永远同步扩展性想加个“保存到 JSON”功能会很乱只需要在仓库变动时加一行保存代码第一步定义你的“商品”是什么User类先告诉电脑“用户”长什么样。public class User { public int Id { get; set; } // 序号 public string Name { get; set; } // 姓名 public int Age { get; set; } // 年龄 }第二步建立“智能仓库” (BindingList)BindingListUser和普通List的区别在于它自带“报警器”。// 在窗体类里声明 BindingListUser users new BindingListUser();作用ListUser普通列表你可以把它想象成一个普通仓库你可以往里面放东西Add、拿东西Remove但仓库自己不会主动通知别人“我变了”比如你在代码里加了个用户界面上的表格 / 列表控件根本不知道不会自动刷新BindingListUser绑定列表它就是个带自动报警器的智能仓库除了放东西、拿东西它自带一个ListChanged事件就是 “报警器”只要你往里面加 / 删 / 改数据它就会自动触发这个事件通知绑定它的界面控件“喂我变了你快更新显示”第三步连接“仓库”与“货架” (数据变更事件)这是最关键的逻辑我们要告诉程序一旦仓库有变动就去刷新货架。监听变动// 在窗体初始化时绑定 users.ListChanged Users_ListChanged;编写“刷货架”的方法 (RenderRow)private void Users_ListChanged(object sender, ListChangedEventArgs e) { // 简单粗暴的方法先清空货架再根据仓库里的东西重新摆 listView1.Items.Clear(); foreach (var user in users) { ListViewItem item new ListViewItem(user.Id.ToString()); item.SubItems.Add(user.Name); item.SubItems.Add(user.Age.ToString()); listView1.Items.Add(item); } }第四步操作“仓库”即可有了上面的自动化连接你以后再也不用写listView1.Items.Add这种代码了。添加数据// 你只管往仓库里加人界面会自动跳出新行 users.Add(new User { Id 1, Name 张三, Age 25 });删除数据// 你只管从仓库里移除界面会自动消失那一行 users.RemoveAt(0);