【问题标题】:How Do I Stop Visual Studio from Generating Setter Calls in my UserControl?如何阻止 Visual Studio 在我的 UserControl 中生成 Setter 调用?
【发布时间】:2011-08-09 17:36:33
【问题描述】:

我为我的 Winform 应用程序创建了几个从 UserControl 继承的控件。根据需要,它们都有无参数的构造函数。当我将它们放到我的主窗体上时,我在设计时在 Visual Studio 中收到一个错误,它无法呈现窗体。

我发现,在窗体的 Designer.cs 文件中,我的控件被实例化,IDE 在那里放置了一行调用我的设置器之一。 BlockKey = 0。好吧,setter 后面的代码正在调用其他代码,很快就会抛出 NullReferenceException,因为表单没有运行;那个时候其他代码还没有准备好产生任何东西。

如果我手动删除 setter 行,错误就会消失。但是关闭并重新打开或重新编译,IDE 会将行重新放入。我尝试在 UserControl 中使用 [DefaultValue(false)] 装饰 setter,认为这会抑制对 setter 的设计时调用,但事实并非如此。

我怎样才能摆脱设计器中的那条线?或者我是否应该在 setter 中编写一些预防性代码?

【问题讨论】:

    标签: c# winforms visual-studio visual-studio-2010 code-generation


    【解决方案1】:

    您应该在属性上使用DesignerSerializationVisibilityAttribute 属性,并将其设置为Hidden

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public int BlockKey
    {
        get { return 0; }
        set { /* Do something */ }
    }
    

    或者,如果您需要更具体的逻辑(即仅在某些条件下进行序列化),那么您必须创建一个返回布尔值并具有bool ShouldSerialize*PropertyName*() 格式的特定名称的函数

    bool ShouldSerializeBlockKey()
    {
         return false;
    }
    

    (注意:我忘记了这个函数是否必须是公共的......)

    【讨论】:

    • 对了,DefaultValue 属性是设计器的属性窗口用来启用右键重置功能的。
    • 这是关于更手动的 ShouldSerialize 方法的文档 - msdn.microsoft.com/en-us/library/53b8022e(v=vs.71).aspx
    • 方法有类似的吗?在我的构造函数中,我调用了另一个方法,该方法进入数据库以获取一些数据以填充组合框。该调用再次在设计时使表单崩溃。这方面的最佳做法是什么?
    • 如果是这种情况,那么您将不得不使用受保护的DesignMode 属性来隔离非设计者代码。
    【解决方案2】:

    您正在寻找的是DesignerSerializationVisibilityAttribute。这控制设计器是否将序列化出特定属性的默认

    如果您将属性指定为Hidden,设计器将不会为它们添加值

    【讨论】:

      猜你喜欢
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多