Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# winforms和C的.Controls.Add()上的System.NullReferenceException#_C#_Winforms_User Controls_Nullreferenceexception - Fatal编程技术网

C# winforms和C的.Controls.Add()上的System.NullReferenceException#

C# winforms和C的.Controls.Add()上的System.NullReferenceException#,c#,winforms,user-controls,nullreferenceexception,C#,Winforms,User Controls,Nullreferenceexception,我用C#开发了一个小型WinForm应用程序。 我已经发布这个应用多年了,很多用户在很多不同的Windows系统上使用它,包括Windows XP、Vista、7、8、32位和64位 但几天前,一位用户报告在Windows7 64位机器上启动应用程序时发生崩溃。因为我无法重现我这边的错误,所以我给他发送了调试版本,可以输出日志信息 现在我已经找到了发生故障的线路 this.Controls.Add(this.myUserControl); 这是VisualStudio从表单设计器生成的一行。“

我用C#开发了一个小型WinForm应用程序。 我已经发布这个应用多年了,很多用户在很多不同的Windows系统上使用它,包括Windows XP、Vista、7、8、32位和64位

但几天前,一位用户报告在Windows7 64位机器上启动应用程序时发生崩溃。因为我无法重现我这边的错误,所以我给他发送了调试版本,可以输出日志信息

现在我已经找到了发生故障的线路

this.Controls.Add(this.myUserControl);
这是VisualStudio从表单设计器生成的一行。“this.myUserControl”是用户控件的实例。此用户控件是在此项目中生成的,不包括任何外部组件。只是用一些标准的UI控件构建的。 .NET错误信息为

“System.NullReferenceException:对象引用未设置为 对象的实例。”

在将this.myUserControl添加到控件之前,我添加了测试它是否为null的代码,它肯定不是null

我尝试过很多方法,比如使用corflags.exe强制它在32位模式下运行,或者将构建目标框架更改为3.5(在2.0之前)

没有什么变化。它总是在那条线上崩溃

在发布之前,我已经在Windows7 64位上测试过这个应用程序,这个应用程序有很多用户在Windows7 64位上使用它。所以我认为我不应该改变任何代码。但我对如何解决这个问题没有任何方向

我应该告诉用户重新安装Windows还是修复.Net Framework?是否有人在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
不为空;所以
这个.Controls
可能是问题所在。检查是否存在
System.ComponentModel.i容器组件
初始化组件()
;可能缺少或未初始化某些内容

覆盖
OnLayout
OnPaint
将有助于调试,
IsHandleCreated
也可能是发现异常的关键点


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

关于碰撞的堆栈/线;那么您是说设计器代码中有问题的这一行位于堆栈的最顶端,即使您选中了“ShowExternalCode”

尽管您已确认它正在相关线路上崩溃:

this.Controls.Add(this.myUserControl)

我有点怀疑。如果它在该行崩溃,而不是在Controls.Add方法内部,那么似乎只有两种可能性:

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

2)
为空-这是不可能的


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

您能展示一下如何创建UserControl实例的代码吗。。?请显示您正在使用的代码。。?确保您没有试图引用超出范围的控件。显示您在何处创建
UserControl
实例。此控件还控制它引用的内容
面板、ListView等。
用户控件包含面板、DataGridView和另一个UserControl,该控件也构建在此项目中,没有任何外部组件。这个用户控件的Designer.cs中的代码太长了。恐怕我不能把它贴在这里。也许是个愚蠢的问题,但你肯定那是一条撞车线吗?我想知道符号/来源是否不完全匹配。。如果确定这一行,它是发生在
Add()
方法(.Net code)的某个地方,还是发生在实际的那一行?(你的代码)当那个家伙可以简单地尝试重新安装.Net Framework时,为什么要伤脑筋呢?我猜那里有点乱七八糟。如果这不起作用-请退出。我隐藏用户控件的真实名称和项目的真实名称。我只是将它们替换为“myUserControl”和“ProjectNameSpace”。因为我公司的一些规定。@user2351537:不客气。也许您可以为外部站点(如github)提供完整的代码,这将有助于找出确切的问题所在。