系统.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);

系统.winforms和c#中this.Controls.Add()的NullReferenceException

如您所述,this.myUserControl不为空;所以this.Controls可能是问题所在。检查System.ComponentModel.IContainer componentsInitializeComponent();可能缺少某些内容或未初始化。

覆盖OnLayoutOnPaint将有助于调试,IsHandleCreated也可能是找出异常的关键点。

最简单的方法是使用designer创建一个新的用户控件,并粘贴为业务编写的代码。记住将控件命名为与原始控件相同。

至于崩溃的堆栈/行;所以你是说这行问题在你的设计器代码是在堆栈的顶部,即使你有"显示外部代码"勾选?

虽然你已经确认它在问题线上崩溃了:

this.Controls.Add(this.myUserControl);

我有点怀疑。如果它在那行上崩溃,而不是在控件的内的。方法,那么似乎只有两种可能:

1)。控件为空-在此之前是否添加了任何控件?如果是这样的话,这似乎是不可能的。

2) this是null -这是不可能的…

您可以尝试的一件事是发送这个客户代码,它只是一个简单的for,添加一个简单的控件(这不是您的自定义控件)。或者让他们运行其他c#表单应用程序。这可能会帮助你缩小范围。