VS 2008设计师和用户控​​制

时间:2010-04-13 11:29:56

标签: c# .net winforms user-controls

我创建了一个自定义数据网格控件。我在Windows窗体上拖动它并将其属性设置为列和所有&跑了这个项目。它构建成功,我能够在表单上查看网格控件。

现在,如果我尝试在设计器中查看该表单,我会收到以下错误..

Object reference not set to an instance of an object.     




Instances of this error (1)  

1.   Hide Call Stack 

at Microsoft.VisualStudio.Design.Serialization.CodeDom.XML.CodeDomXmlProcessor.GetMemberTargetObject(XmlElementData xmlElementData, String& member)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.XML.CodeDomXmlProcessor.CreateAssignStatement(XmlElementData xmlElement)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.XML.CodeDomXmlProcessor.XmlElementData.get_CodeDomElement()
at Microsoft.VisualStudio.Design.Serialization.CodeDom.XML.CodeDomXmlProcessor.EndElement(String prefix, String name, String urn)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.XML.CodeDomXmlProcessor.Parse(XmlReader reader)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.XML.CodeDomXmlProcessor.ParseXml(String xmlStream, CodeStatementCollection statementCollection, String fileName, String methodName)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomParser.OnMethodPopulateStatements(Object sender, EventArgs e)
at System.CodeDom.CodeMemberMethod.get_Statements()
at System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.Deserialize(IDesignerSerializationManager manager, CodeTypeDeclaration declaration)
at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager manager)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.DeferredLoadHandler.Microsoft.VisualStudio.TextManager.Interop.IVsTextBufferDataEvents.OnLoadCompleted(Int32 fReload) 

如果我忽略该异常,表单将显示为空白,并且没有网格控件的迹象。但是我可以在设计器文件中看到网格的代码。

任何关于此的指针都会有很大的帮助。

我为自定义要求定制了网格,就像我添加了自定义文本框一样。我已经定义了3个构造函数

public GridControl() 
public GridControl(IContainer container) 
protected GridControl(SerializationInfo info, StreamingContext context)

4 个答案:

答案 0 :(得分:0)

听起来你的控件的默认构造函数(没有参数的构造函数)中会抛出NullReferenceException。显然,这个异常仅在设计时抛出,因为你说它在运行时工作。您是否在此构造函数中执行任何初始化代码,如数据库调用或类似的?或者您是否使用了在设计时可能无法使用的任何实例?

答案 1 :(得分:0)

表单设计者似乎正在尝试初始化控件。然而,它试图初始化的属性可能已从UserControl中删除。有很多方法可以解决这个问题。我建议你在设计时调试控件。这是找到问题的最可靠方法。在http://social.msdn.microsoft.com/Search/en-US?query=design-time+control+debugging&ac=8

查看“MSDN Search”中的“设计时控制调试”

答案 2 :(得分:0)

我一直有这个问题......很糟糕。

[漫步(上)]

我认为这就是我所知道的:

  1. 设计时将控件放在表单上。经常构建和刷新......这会让你知道设计师对barf的影响是什么。
  2. 关闭视觉工作室一直重新打开....我不能告诉你有多少次我追逐设计师错误,这是设计师被“卡住”。
  3. 你明白这一点非常重要:设计师真的非常愚蠢......就像傻瓜一样。
  4. 自定义对象类型的任何公共字段或属性几乎总会导致设计人员混淆*。我发现以下属性可以解决大多数这些问题:

    [可浏览(假)]

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

  5. 没有默认构造函数的公共字段或属性总是会导致设计人员混淆。当您在表单上删除用户控件时,设计器会有效地创建控件。因此任何公共对象都需要一个清晰的创建路径。我发现最简单的方法(读取hack)是将非平凡的自定义类保持为私有,并将公共属性公开为外观。

  6. - 我说重启visual studio是因为有时候设计师“卡住”了一个不存在的错误吗?我希望我做到了。

    [漫步(关闭)]

    我希望其中一些有帮助..

    *设计师混淆:设计师不会显示您的控件,而是向您显示一条无用的错误消息,该消息可能包含或可能不包含可以保护您免受代码丢失的可怕警告......等等,等等。

答案 3 :(得分:0)

我遇到了同样的错误检查你的Windows Form类是否继承了System.Windows.Forms.Form类,如Form1:Form希望dis help !!!!