22

在使用 Visual Studio 2008 愉快地破解这个 C# 应用程序几天后,我被一连串的错误对话框震惊了:

属性“ valueMember ”的代码生成失败。
错误是:“对象引用未设置为对象的实例。”

现在,当我在设计器中进行微小更改时,通常会发生这种情况,例如将控件移动几个像素,然后尝试保存。每秒会出现几个这样的错误对话框,让我忙着通过敲击 Enter 键来取消所有这些对话框,同时尝试让 alt-F4 关闭 VS。

最终我确实让 VS 关闭并保存我所做的更改。重新启动 VS 后,我对整个项目进行“清理”,然后“构建”,一切正常,应用程序运行正常,没有问题。

直到我在表单设计器中再做一个小改动。

我不知道valueMember我的应用程序中的任何属性。

这让我发疯,这对我的项目来说是一个真正的展示。任何帮助表示赞赏。

4

9 回答 9

20

尝试关闭并重新打开 Visual Studio。也许它看起来很傻,但它有效!

于 2014-09-18T09:30:19.090 回答
16

您可以使用另一个视觉工作室调试设计器并附加到进程。如果您遇到异常,应该很容易找到它。通常,当打开设计器时,构造函数当然还有 initializeComponent 正在运行。

于 2012-11-22T19:17:42.007 回答
12

由于这是在设计时发生的,因此您可能有一个自定义控件,它需要一个没有默认值的参数或其他值。

在 Visual Studio 的设计视图中时;创建了一个控件实例以在可视化编辑器上呈现它,但如果控件需要在呈现之前设置属性,则会导致错误。

您能否检查所有自定义控件是否具有默认值,并且构造函数中引用的任何不能具有默认值的内容都由DesignMode属性包装 - 请参阅http://msdn.microsoft.com/en-us/library/system.componentmodel.component。设计模式.aspx

于 2012-11-22T17:15:33.760 回答
2

类似于@Chanipoz 的回答(关闭/重新打开),在我关闭主表单设计器窗口后,我的组件丰富/用户控件无处不在的表单应用程序开始愉快地编译。

我已经使用这个代码栈多年了,直到今天才看到这个错误。不确定它来自哪里。但是,今天在设计器中打开表单的事情让一切都不愉快。只需将其从屏幕上关闭即可使一切顺利进行。

于 2015-01-27T15:56:09.207 回答
1

使用 Visual Studio 的另一个实例附加到 Visual Studio 的第一个实例。

转到调试-> 附加到进程并查找 devenv.exe 进程。由于您将运行两个 devenv.exe 进程,因此您可能希望选择 ID 较低的进程,这通常是运行的第一个 Visual Studio 实例。

于 2019-09-19T19:03:07.097 回答
0

我不得不面对这个问题。由于我还没有找到解决方案(很多继承),我可以说: .SuspendLayout()并且.ResumeLayout()可能在代码或其中之一中丢失。和.BeginInit()也是如此.EndInit()。他们之间预计会有= new ...一些属性设置。也许面临这个问题的人会通过这些信息找到解决方案。

于 2014-03-17T18:03:39.660 回答
0

问题是缺少控件上公共属性的初始化代码。这将在您将控件添加到设计器时为您添加,但如果您将控件替换为派生控件,或者更新组件,那么设计器将不知道如何处理。

如果您有一个具有公共属性 PropertyA 的控件 (wincontrol),并将其添加到表单 (myForm),那么设计器会将属性的所有必要初始化添加到 myForm.Designer.cs。就像是;

Wincontrol1.PropertyA = new List<widget>();

需要稍微修改控件的情况并不少见,假设我们有一个新控件 MyWinControl

public partial class MyWinControl : WinControl
{
    public List<wodget> PropertyDer1;
    protected List<wodget> PropertyDer2;
}

如果您在 myForm.Designer.cs 中将这个新控件替换为旧控件,那么您很可能会遇到这个问题。原因是 PropertyDer1 在 winforms 设计器中没有初始化。PropertyDer2 不会引起任何问题,因为它受到保护。同样,如果您有一个自定义组件,并且在将组件添加到表单后添加了一个新的公共属性。

但是,如果您删除了窗体上的 WinControl 实例,而是将 MyWinControl 的一个实例拖到窗体上,则会发生正确的初始化并且您不会看到错误。设计师将像这样创建新控件

Wincontrol1.PropertyA = new List<widget>();
Wincontrol1.PropertyDer1= new List<wodget>();

有两种简单的解决方案不需要对设计者隐藏属性。1.如果属性不需要公开,给它正确的修饰符 2.如果属性确实需要公开,那么只需像上面的代码一样编辑myForm.Designer.cs中的代码,添加缺少的初始化器

于 2020-02-14T06:26:46.790 回答
0

如果有帮助的话,我刚刚检测到一个带有相同错误消息的案例,无法删除:我正在开发一个法语应用程序,我必须创建一个 ToolStripMenuItem,其中包含一个重音词,例如“annulées”。系统生成了一个类似“annuléesToolStripMenuItem”的菜单项,而重音是罪魁祸首。足以删除该项目,用英语再次创建它,只需更改菜单项的 Text 属性。希望它会有所帮助。

于 2021-07-10T11:41:33.567 回答
0

我不得不面对这个问题。正如我在下面找到的解决方案一样,我在自定义控件中遇到了这个问题。

我们需要像这样实现

[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public MyCustomclass _Prperty { get; set; }
于 2022-01-24T12:15:24.273 回答