这是对All controls on a form are invisible的跟进,现在我对它有了更多的了解。
我有一个使用Visual Studio 2010的Windows窗体设计器创建的某个窗体。它在本周某个时间工作正常。现在,当我对表单进行任何更改并且设计器重新创建.designer.cs
文件时,所有绑定成员都设置为“none”,并且所有Controls.Add
调用都将被删除。控件仍然在设计器中可见,但是当我运行项目时,控件都是不可见的(由于没有Controls.Add调用)。如果我关闭并重新打开设计器,则表单为空白。
没有错误,警告或消息表明设计师为什么是混蛋,我真的不想重新创建该表单上的每一个控件,但看起来我可能别无选择。
答案 0 :(得分:4)
设计人员容易受到在设计时运行的代码引发的异常的攻击。其中包括控件和方法的构造函数,如OnPaint(),OnResize()等。如果您的代码在设计时无法正常工作,例如依赖于默认工作目录中的文件,可以连接的dbase服务器等等,那么该代码可能会异常爆炸。
您首先会注意到设计者提出的崩溃屏幕,它显示的堆栈跟踪通常不能用于诊断原因,因为它有许多设计器内部的方法或代码序列化程序。第二个影响是,当代码序列化程序在尝试检索属性值以为其生成代码时崩溃时,您可能会丢失InitializeComponent()方法中的内容。当您看到Controls.Add()调用丢失时,毫无疑问会发生这种情况。
在发生此类事故后保存designer.cs文件会让您遇到麻烦。修复损坏可能很棘手,从VCS恢复表单源代码文件通常是最好的选择。
答案 1 :(得分:3)
如果我删除了无参数构造函数,那么过去我遇到过类似问题的地方就是这样。设计者不知道如何在没有no-arg构造函数的情况下创建表单。
如果您只希望使用带参数的构造函数创建表单,则解决方案是保留无参数构造函数,但将其设置为私有。设计师仍然可以这样使用它,但没有其他人可以。
答案 2 :(得分:2)
最好的建议也是最具面对性的建议:从源代码管理中恢复以前的版本。
如果无法做到这一点,您将不得不使用设计器重新创建表单。
除非您完全知道自己在做什么,否则永远不要触摸设计器文件。
对不起,新的并不比这更好。
答案 3 :(得分:1)
事实证明,真正的根本原因是在.NET 3.5模式下进行编译,即使设计人员偏向于.NET 4.0。在针对.NET 4.0进行编译时,它可以正常工作,但只要.resx更改为引用“2.0.0.0”绘图组件而不是“4.0.0.0”,设计师就会感到非常震惊。
答案 4 :(得分:0)
唯一的解决方案是手动添加Controls.Add
来电。当我使用MenuStrips时,在Visual Studio 2008中发生了很多这种情况。问题可能仍然存在于2010年。
或者,正如其他人所建议的那样,重新创建表单。