在VB .NET中单击并拖动用户控件会创建对象引用错误消息

时间:2008-12-13 06:50:57

标签: vb.net visual-studio controls

无法创建组件“用户控件1”。错误信息如下:

  

'System.NullReferenceException:未将对象引用设置为对象的实例。   在System.ComponentModel.ReflectPropertyDescriptor.SetValue(对象组件,对象值)   ..............等..........

我该怎么做才能解决此错误?

4 个答案:

答案 0 :(得分:8)

当用户控件无法加载到Visual Studio设计器中时,您需要执行此操作。这些指令适用于vb.net项目,但c#应该类似。此外,在此之前关闭所有打开的窗口(或至少您正在处理的控件的源和设计器文件。)

最后一件事。您应该做的第一件事是确保重新启动visual studio不能解决问题。如果没有,您可以尝试以下步骤。这些说明假定错误的用户控件位于visual studio中的控件库项目中。如果没有,你应该能够稍微调整方向以使其工作,但当控件在自己的项目中时,它会容易得多。

执行以下操作:

  1. 使控件库成为您的启动项目。
  2. 打开控件库项目的属性,然后单击调试选项卡。
  3. 在“开始操作”下,单击“启动外部程序”选项并浏览到Visual Studio可执行文件。
  4. 注意:这意味着当您运行解决方案时,它将启动另一个Visual Studio实例,而不是实际运行您的解决方案。 Visual Studion的第一个实例(INSTANCE_1)将在您运行时“托管”Visual Studio的第二个实例(INSTANCE_2)。

    1. 运行您的解决方案。 INSTANCE_2将加载。
    2. 切换回INSTANCE_1。
    3. 在INSTANCE_1中按CTRL-ALT-E。这将打开例外对话框。选中Common Language Runtime Exceptions旁边的THROWN列复选框。
    4. 注意:这将确保INSTANCE_1在任何运行时错误都会发生故障,即使它在try块中命中也是如此。

      1. 切换到INSTANCE_2。在解决方案资源管理器中,双击以打开错误的用户控件。
      2. 您应该会发现Visual Studio的INSTANCE_1应该停在导致设计者不加载控件的代码行上。修复代码(这通常意味着在引用对象属性之前测试IsNot Nothing ......但可能意味着其他事情。)

        此外,有时我发现控件将在INSTANCE_2中加载,而不是在INSTANCE_1中打破错误。在这种情况下,只需停止调试...关闭INSTANCE_2。保存/重新启动INSTANCE_1,您的问题通常会消失。

        教训是这样的。用户控件必须能够加载/引用所有对象及其成员,以便将其加载到设计器中。因此,对于将放置在其他容器上的用户控件,我通常会设计事件来通知父级,而不是尝试将对象推送到子控件中。

        希望这有助于将来参考这个老问题。

        赛斯

答案 1 :(得分:2)

当您打开表单进行编辑时,不会发生错误,而是在您编辑表单并添加新用户控件时发生这种情况。之前提到的CodeProject article显示了在表单未正确加载的情况下该怎么做,而不是特定的用户控件。

您的用户控件是否具有映射到自定义对象的任何属性(即不是IntegerString)?如果是这样,表单设计器将尝试将您的属性加载到属性编辑器中。如果显示属性会生成错误,表单设计器将向您显示该错误。我认为这是您的用户控制所发生的事情。

如果您可以编辑问题并添加有关错误性质的更多信息(更多错误文本),则可以帮助其他人更好地帮助您。或者,查看是否可以找到可能导致错误的属性(例如,是否有任何属性依赖于设置的非空值)。您还可以查看此MSDN article以获取有关如何限制运行时控件的提示。

答案 2 :(得分:0)

谢谢,塞思,这篇文章!您的解决方案帮助我确定了错误。我唯一要补充的是,当加载“INSTANCE_2”时,您可能需要在INSTANCE_2中实际加载项目文件。我需要,因为我没有处理控件库,而是在表单所在的同一项目中定义了自定义用户控件。一旦我在INSTANCE_2中加载项目,我打开了错误的表单,这导致了INSTANCE_1弹出用户控件中的违规代码行。

答案 3 :(得分:0)

我发现当控制dll没有正确构建时,通常会发生此错误。 95%的时间只需重新启动Visual Studio即可解决此问题。