[英]C# VS12 Designer Error on saving a custom derived form in design mode
我目前在VS12和内置设计器中遇到问题。 我正在使用一个自定义控件框架,该框架基本上扩展了基本的用户控件和DevExpress控件。 一段时间以来,当我尝试更改属性或移动其中一个控件时,在以设计方式保存表单时遇到问题。 我试图尽可能翻译错误消息(我使用的是VS的德语版本)。
Visual Studio Designer Error Message:
Error during code generation for the MyPropertyMap-property. Error: The property accessor for the MyPropertyMap for the settings object has caused an exception: The enumeration has changed. Enumeration could not be executed.
我尝试使用启用了CLR调试的Visual Studio的另一个实例调试设计器异常:
System-InvalidOperationException
The enumeration has changed. Enumeration could not be executed.
Source: CustomForm
StackTrace: MyNamespace.Controls.CustomForm.get_FormVariables()
TargetSite: System.Collections.Hashtable get_FormVariables()
尽管我尝试使用以下代码向设计师隐藏属性,但看起来设计师似乎尝试访问表单上的属性:
[NonSerialized]
private Hashtable formVariables = null;
[EditorBrowsable(EditorBrowsableState.Never)]
[Browsable(false)]
public Hashtable FormVariables
{
get
{
...
我尝试添加NonSerialized字段,因为我认为属性的序列化可能会导致问题。 getter基本上查询表单面板上的所有控件,并将它们添加到哈希表中,因为我正在使用它们进行一些基于计时器的操作。 但是在设计期间,设计人员不必访问此属性。 有什么建议可以让我真正地对设计师隐藏并防止出现此错误?
如果我错过任何其他重要建议,请告诉我。
编辑:
我仍在尝试找出导致问题的原因。 我发现的一件事是,当我在Visual Studio设计器设置中禁用“优化代码合并”设置时,该错误始终发生。 当我重新启用它时,第一次尝试保存表单时会发生一次错误-而第二次尝试则不会发生-这意味着该表单已保存。 我现在不确定它是否一直都在工作-但至少我尝试过几次。
如果现在处于DesignMode,则实现与枚举或其他集合对象一起使用的所有公共属性以返回null。 当设计人员尝试访问getter函数时,仍然会发生异常。
亲切的问候。
我认为您应该在getter中设置DesingMode的检查。 无论设置了什么属性,winforms设计器AFAIK都会访问属性。
默认情况下,设计器将尝试执行在设计器文件中看到的代码。 有时这可能会导致自定义控件出现问题-尤其是当它们在运行时执行意外的绑定形式或枚举集合时。 您需要使用设计时检查来跳过相关代码
来自MSDN的一个很好的例子:
void timer_Tick(object sender, EventArgs e)
{
if( this.DesignMode )
return;
this.Refresh();
}
如果Designmode处于活动状态,则代码将过早返回(跳过refresh方法)。 这仅在设计人员启动并且完全不会损害正在运行的应用程序时发生。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.