WinForm中带参打开窗体时ListView列头丢失问题排查
问题成因与解决思路
问题成因
带参构造函数中存在重复调用InitializeComponent()的致命错误:
- 带参构造通过
: this()已经触发了无参构造,而无参构造里已经执行过InitializeComponent()完成所有控件的初始化; - 后续在带参构造末尾再次调用
InitializeComponent(),会完全重置所有控件的初始状态,包括你刚刚添加的ListView列头,直接导致列头丢失、关联功能异常。
解决思路
- 核心修复:直接删除带参构造函数最后一行的
InitializeComponent();,确保控件仅被初始化一次。 - 代码优化:将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"); } - 额外检查:确认ListView的
View属性设置为Details(可在设计器中设置,或通过代码如上添加),这是WinForm ListView显示列头的必要条件。
内容的提问来源于stack exchange,提问作者Artur Ribeiro
相关产品推荐
相关产品推荐

