如何通过代码刷新子ListView?父项点击后子列表无视觉更新
问题修复:父子ListView点击刷新无视觉更新
问题根源
原代码核心问题是WinForms控件添加顺序错误:先添加父ListView(DockStyle.Left),再添加子ListView(DockStyle.Fill),导致子ListView被父ListView覆盖在下层,即便数据更新也无法正常显示。此外子ListView列宽未做自适应处理,可能导致内容显示不全。
修复后的完整代码
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; void Main() { // 示例数据 var table1 = new List<ParentRow> { new ParentRow { ParentID = 1, ParentName = "父项1" }, new ParentRow { ParentID = 2, ParentName = "父项2" }, new ParentRow { ParentID = 3, ParentName = "父项3" } }; var table2 = new List<ChildRow> { new ChildRow { ChildID = 1, ParentID = 1, ChildName = "子项1.1" }, new ChildRow { ChildID = 2, ParentID = 1, ChildName = "子项1.2" }, new ChildRow { ChildID = 3, ParentID = 2, ChildName = "子项2.1" } }; // 创建窗体 var form = new Form { Text = "父子列表联动示例", Width = 800, Height = 600 }; // 父ListView var listView1 = new ListView { View = View.Details, Dock = DockStyle.Left, Width = 300 }; listView1.Columns.Add("父ID", 80); listView1.Columns.Add("父名称", 200); foreach (var row in table1) { var item = new ListViewItem(row.ParentID.ToString()); item.SubItems.Add(row.ParentName); item.Tag = row.ParentID; listView1.Items.Add(item); } // 子ListView var listView2 = new ListView { View = View.Details, Dock = DockStyle.Fill }; listView2.Columns.Add("子ID", 80); listView2.Columns.Add("子名称", 200); // 列宽自适应表头 listView2.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); // 父项选中联动事件 listView1.SelectedIndexChanged += (sender, args) => { if (listView1.SelectedItems.Count == 0) return; var selectedParentID = (int)listView1.SelectedItems[0].Tag; var childRows = table2.Where(c => c.ParentID == selectedParentID).ToList(); listView2.BeginUpdate(); listView2.Items.Clear(); foreach (var child in childRows) { var item = new ListViewItem(child.ChildID.ToString()); item.SubItems.Add(child.ChildName); listView2.Items.Add(item); } listView2.EndUpdate(); // 数据更新后自适应列宽,确保内容完整显示 listView2.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); }; // 关键修复:调整控件添加顺序,先加子ListView(Fill),再加父ListView(Left) form.Controls.Add(listView2); form.Controls.Add(listView1); form.ShowDialog(); } // 数据实体类 public class ParentRow { public int ParentID { get; set; } public string ParentName { get; set; } } public class ChildRow { public int ChildID { get; set; } public int ParentID { get; set; } public string ChildName { get; set; } }
核心修改点
- 调整控件添加顺序:先添加子ListView(
DockStyle.Fill),再添加父ListView(DockStyle.Left),确保子列表能占据父列表右侧剩余空间,不会被覆盖。 - 添加列宽自适应:初始化和数据更新后调用
AutoResizeColumns,保证内容完整显示。 - 简化判断逻辑:将冗余判断改为提前退出,代码更简洁。
内容的提问来源于stack exchange,提问作者junkone
相关产品推荐
相关产品推荐

