系统.winforms和c#中this.Controls.Add()的NullReferenceException
本文关键字:Add NullReferenceException Controls this winforms 系统 | 更新日期: 2023-09-27 18:12:10
我用c#开发了一个小型的WinForm应用程序。我发布这个应用程序已经很多年了,很多用户在许多不同的Windows系统上使用它,Windows XP、Vista、7、8、32位和64位。
但是几天前,一个用户报告在Windows 7 64位机器上启动应用程序时崩溃。因为我这边无法重现错误,所以我给他发了可以输出日志信息的调试版本。
现在我找到了
上出错的行this.Controls.Add(this.myUserControl);
这是Visual Studio从窗体设计器生成的一行。"这。myUserControl"是一个用户控件的实例。此用户控件内置在此项目中,不包括任何外部组件。只是用一些标准UI控件构建。.NET错误信息为
"系统。NullReferenceException:对象引用未设置为an对象的实例。"
我已经添加了代码来测试是否这个。myUserControl在添加到控件之前是空的,它肯定不是空的。
我尝试了很多方法,比如使用corflags.exe强制它在32位模式下运行或将构建目标框架更改为3.5(在2.0之前)
没有变化。它总是在那一行崩溃。
在发布之前,我已经在Windows 7 64位上测试了这个应用程序,这个应用程序有很多用户在Windows 7 64位上使用它。所以我认为我不应该改变任何代码。但是我不知道如何解决这个问题。
我应该告诉用户重新安装Windows还是修复。net框架?有人在Windows 7 64位上遇到这个错误吗?
英语不是我的母语,所以很抱歉我的英语。与用户控件相关的代码,所有这些代码都是从表单设计器生成的:
private MyUserControl myUserControl;
this.myUserControl = new ProjectNameSpace.MyUserControl();
this.myUserControl.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.myUserControl.Location = new System.Drawing.Point(12, 80);
this.myUserControl.Name = "myUserControl";
this.myUserControl.Size = new System.Drawing.Size(775, 412);
this.myUserControl.TabIndex = 2;
this.myUserControl.Resize += new System.EventHandler(this.myUserControl_Resize);
this.Controls.Add(this.myUserControl);
如您所述,this.myUserControl
不为空;所以this.Controls
可能是问题所在。检查System.ComponentModel.IContainer components
、InitializeComponent()
;可能缺少某些内容或未初始化。
覆盖OnLayout
或OnPaint
将有助于调试,IsHandleCreated
也可能是找出异常的关键点。
最简单的方法是使用designer创建一个新的用户控件,并粘贴为业务编写的代码。记住将控件命名为与原始控件相同。
至于崩溃的堆栈/行;所以你是说这行问题在你的设计器代码是在堆栈的顶部,即使你有"显示外部代码"勾选?
虽然你已经确认它在问题线上崩溃了:
this.Controls.Add(this.myUserControl);
我有点怀疑。如果它在那行上崩溃,而不是在控件的内的。方法,那么似乎只有两种可能:
1)。控件为空-在此之前是否添加了任何控件?如果是这样的话,这似乎是不可能的。
2) this
是null -这是不可能的…