2

我目前在 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 函数时,仍然会发生异常。

亲切的问候。

4

2 回答 2

0

默认情况下,设计器会尝试执行它在设计器文件中看到的代码。这有时会导致自定义控件出现问题——尤其是当它们在运行时执行意外的绑定形式或枚举集合时。您需要使用设计时检查跳过相关代码

来自MSDN的一个很好的例子:

 void timer_Tick(object sender, EventArgs e)
 { 
   if( this.DesignMode )   
     return; 

    this.Refresh(); 
 }

如果设计模式处于活动状态(跳过刷新方法),此处代码将过早返回。这仅在设计人员启动并且根本不会损害正在运行的应用程序时发生。

于 2013-08-20T14:01:22.917 回答
0

我认为您应该在 getter 中设置对 DesingMode 的检查。无论设置了什么属性,winforms 设计器 AFAIK 都会访问属性。

于 2013-08-20T13:59:38.830 回答