如何阻止Visual Studio在UserControl中生成Setter调用?

时间:2011-04-20 18:09:36

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

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

我发现,在我的控件实例化的表单的Designer.cs文件中,IDE在那里调用一个调用我的一个setter的行。 BlockKey = 0。好吧,setter背后的代码是调用其他代码,很快就会抛出NullReferenceException,因为表单没有运行;其他代码不准备在那时产生任何东西。

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

如何摆脱Designer中的那一行?或者我希望在setter中写一些预防性代码呢?

2 个答案:

答案 0 :(得分:3)

您应该使用属性中的DesignerSerializationVisibilityAttribute属性并将其设置为Hidden

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

或者,如果您需要更具体的逻辑(即仅在某些条件下序列化),那么您必须创建一个返回bool并具有bool ShouldSerialize*PropertyName*()

格式的特定名称的函数
bool ShouldSerializeBlockKey()
{
     return false;
}

(注意:我忘记了这个功能是否必须公开......)

答案 1 :(得分:2)

您正在寻找的是DesignerSerializationVisibilityAttribute。这可以控制设计人员是否会为特定属性序列化默认

如果您将属性指定为Hidden,则设计人员不会为其添加值