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

C# WinForm ListView如何正确分列显示ID与名称列数据

WinForm ListView 多列绑定错位、子项不显示问题修复方案

错误原因

两个版本的代码分别存在不同的用法错误:

  1. 第一版数据错位:循环中连续两次调用lvProvince.Items.Add(),每遍历一个省份实体就会新增2个独立的顶级行——第一行仅填充Id列、第二行仅填充Name列,完全不是同一行的两列数据,必然出现列错位。
  2. 第二版Name列丢失:核心原因是未将ListView的View属性设置为View.Details。WinForm的ListView只有在Details视图模式下才会显示多列及子项内容,默认视图下仅展示第一列的主项文本,其余SubItems全部隐藏。同时通过索引取刚新增项的写法,在新增/删除逻辑变动时容易触发索引越界异常。

正确实现代码

private void btnGetListProvince_Click(object sender, EventArgs e)
{
    rtbRandomPoint.Clear();
    lvProvince.Clear();
    try
    {
        // 必须指定为详情视图,多列才能正常渲染
        lvProvince.View = View.Details;
        // 可选优化配置:开启整行选中,提升交互体验
        lvProvince.FullRowSelect = true;

        rtbRandomPoint.AppendText("\n" + " Successfully get all Province in Viet Nam");
        lvProvince.Columns.Add("id", 70);
        lvProvince.Columns.Add("name", 150, HorizontalAlignment.Left);

        provinces = ProvinceController.getProvinceListByCountry();

        foreach (Province province in provinces)
        {
            // 构造行对象,传入第一列的Id值作为主项
            ListViewItem rowItem = new ListViewItem(province.Id);
            // 追加第二列的Name值为子项,和Id属于同一行
            rowItem.SubItems.Add(province.Name);
            // 将构造完成的整行加入控件
            lvProvince.Items.Add(rowItem);
        }
    }
    catch (Exception ex)
    {
        WarningHelper.ShowExeptionMessage(ex);
    }
}

关键注意事项

  • 只要使用ListView做多列数据展示,必须显式设置View = View.Details,不要依赖设计时的默认配置,避免运行时配置被重置导致显示异常
  • 同一行的多列数据不要拆分多次调用Items.Add(),要先构造单个ListViewItem,所有非第一列的内容都通过该对象的SubItems.Add()方法追加,最后一次性将整行加入控件
  • 如果需要自动适配列宽,可以在绑定完成后调用lvProvince.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent),根据内容长度自动调整列宽,避免内容被截断

内容的提问来源于stack exchange,提问作者Nguyễn Hoài Nam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:48:28