You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过代码刷新子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; }
}

核心修改点

  1. 调整控件添加顺序:先添加子ListView(DockStyle.Fill),再添加父ListView(DockStyle.Left),确保子列表能占据父列表右侧剩余空间,不会被覆盖。
  2. 添加列宽自适应:初始化和数据更新后调用AutoResizeColumns,保证内容完整显示。
  3. 简化判断逻辑:将冗余判断改为提前退出,代码更简洁。

内容的提问来源于stack exchange,提问作者junkone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:52:33