我目前在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.
我尝试使用另一个Visual Studio实例调试设计器异常并启用了CLR调试:
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 designer设置中禁用Optimize Code Gerneration设置时,错误会一直发生。当我重新启用它时,第一次尝试保存表单时出现错误一次 - 而不是第二次尝试 - 意味着表单已保存。我现在不确定它是否一直都这样 - 但至少有几次我尝试过它。
如果现在在DesignMode中,则实现使用枚举或其他集合对象的所有公共属性以返回null。当设计者试图访问getter函数时,仍然会发生异常。
亲切的问候。
答案 0 :(得分:0)
我认为你应该在getter中设置DesingMode的检查。无论设置了什么属性,winforms设计师AFAIK都会访问属性。
答案 1 :(得分:0)
默认情况下,设计人员会尝试执行它在设计器文件中看到的代码。这有时会导致自定义控件出现问题 - 特别是如果他们在运行时对集合执行意外形式的绑定或枚举。您需要使用设计时检查
跳过相关代码来自MSDN的一个很好的例子:
void timer_Tick(object sender, EventArgs e)
{
if( this.DesignMode )
return;
this.Refresh();
}
如果Designmode处于活动状态(跳过刷新方法),代码将过早返回。这只有在设计师启动并且根本不会损坏正在运行的应用程序时才会发生。