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

WinForm中带参打开窗体时ListView列头丢失问题排查

问题成因与解决思路

问题成因

带参构造函数中存在重复调用InitializeComponent()的致命错误:

  • 带参构造通过: this()已经触发了无参构造,而无参构造里已经执行过InitializeComponent()完成所有控件的初始化;
  • 后续在带参构造末尾再次调用InitializeComponent(),会完全重置所有控件的初始状态,包括你刚刚添加的ListView列头,直接导致列头丢失、关联功能异常。

解决思路

  1. 核心修复:直接删除带参构造函数最后一行的InitializeComponent();,确保控件仅被初始化一次。
  2. 代码优化:将ListView列头的初始化逻辑提取为单独方法,统一放到无参构造中,避免重复代码,同时保证两种打开方式下列头都能正确加载:
    public FrmMicroConfig()
    {
        InitializeComponent();
        InitListViewColumns();
    }
    
    public FrmMicroConfig(string device) : this()
    {
        Dispostivo dispositivo = Dispostivo.JsonDesserializar(device);
    
        txtDevicename.Text = dispositivo.Nome;
        txtDeviceIp.Text = dispositivo.IP;
        txtDeviceLocal.Text = dispositivo.Local;
    
        foreach (var Variable in dispositivo.Variables)
        {
            ListViewItem lvi = new ListViewItem(Variable.Nome);
            lvi.SubItems.Add(Variable.Id.ToString());
            lvi.SubItems.Add(Variable.Startbit.ToString());
            lvi.SubItems.Add(Variable.Lenght.ToString());
            lvi.SubItems.Add(Variable.Factor.ToString());
            lvi.SubItems.Add(Variable.Offset.ToString());
            LstdeviceVariables.Items.Add(lvi);
        }
    }
    
    private void InitListViewColumns()
    {
        // 确保ListView处于Details视图,这是显示列头的前提
        LstdeviceVariables.View = View.Details;
        LstdeviceVariables.Columns.Add("Nome");
        LstdeviceVariables.Columns.Add("Id");
        LstdeviceVariables.Columns.Add("StartBit");
        LstdeviceVariables.Columns.Add("Lenght");
        LstdeviceVariables.Columns.Add("Factor");
        LstdeviceVariables.Columns.Add("Offset");
    }
    
  3. 额外检查:确认ListView的View属性设置为Details(可在设计器中设置,或通过代码如上添加),这是WinForm ListView显示列头的必要条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 02:45:12