繁体   English   中英

C#VS12 Designer在设计模式下保存自定义派生表单时出错

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM