Visual Studio 2008 表单设计器弄乱了布尔属性值

Posted

技术标签:

【中文标题】Visual Studio 2008 表单设计器弄乱了布尔属性值【英文标题】:Visual Studio 2008 Form Designer messes up boolean properties values 【发布时间】:2011-02-20 20:14:41 【问题描述】:

我有一个非常烦人的问题,我试图解决几个星期。我有一个 WinForms C# 项目,我在其中开发了我的自定义控件(ListView + ToolStrip 和 ToolStripButtons)。此控件在解决方案中以不同的形式使用 - 但在其他项目中。对于不同的表单,我需要使某些按钮可见或隐藏,因此我在控件中添加了相应的属性,例如

    public Boolean DeleteButtonVisible
    
        get
        
            return tsbDelete.Visible;
        
        set
        
            tsbDelete.Visible = value;
        
    

有些按钮默认是可见的,有些是隐藏的。在设计器中,当使用我的控件编辑表单时,我可以更改这些属性,控件上的按钮会按应有的方式变为可见或隐藏。但是每次我在 all 表单中的控制源文件中更改 anything 时,无论我在设计器中设置了什么,这些属性都会重置为默认值,我必须恢复手动设置这些值。好吧,我正在使用源代码控制,所以这并不难,但是每次我在另一个文件中更改一点时对几十个文件执行“撤消”是一场该死的灾难。

我已尝试使用 [DesignerSerializationVisibility] 属性来解决此问题。如果我将它与值“隐藏”一起使用,它根本没有任何好处 - 只是没有保存值。 “内容”使按钮随机消失,即使默认情况下它们是可见的。 “可见”没有效果,因为这是默认值...

我不想在我的代码中为每个表单设置每个按钮的可见性 - 这不是应该的方式。

有人知道吗?

【问题讨论】:

您是否使用DefaultValue 属性指定了属性的默认值?还是您在构造函数中设置这些值?设计器将始终遵循此属性提供的默认值。 我已经尝试过以这种方式指定默认值并且它有效。问题是我可以在控制代码中执行此操作,而在使用它的表单中我经常需要在表单的设计器中设置非默认值 - 当更改控制代码中的单个字节时,这些值会丢失。 据我了解,如果您的属性具有使用此属性指定的默认值,只要您没有明确设置它,它将被呈现为具有此值。如果设计人员必须刷新这些值,任何未明确设置的内容都将回退到默认值。如果没有该属性,它可能不是您想要的默认值。您应该在构造函数中设置默认值,并使用属性设置相同的值。 @Jeff:我明白这一点,我已经尝试过你的建议 - 这实际上是我要解决的问题)这些值在控件构造函数中设置,在 DefaultValue 属性中设置,然后使用我的控件在表单中用非默认值覆盖。我希望这些值保持非默认并显式设置,但设计人员在我编辑控件代码时强制清除任何覆盖。 【参考方案1】:

是的,Control.Visible 属性很特殊。 getter 确实返回最后分配的值,它仅在控件实际可见时才返回 true。这可能有副作用,你已经找到了。在这种情况下,可能会在控制切换出设计模式时引起。要正确执行此操作,您必须将分配的状态存储在支持变量中。像这样:

    private bool tsbDeleteVisible;

    public bool DeleteButtonVisible 
        get  return tsbDeleteVisible; 
        set  tsbDelete.Visible = tsbDeleteVisible = value; 
    

确保将支持变量的默认值初始化为 tsbDelete.Visible 的默认值。使用构造函数来确定。

【讨论】:

非常感谢您的提示!这真的是我错过的东西。为我的属性添加支持变量后,一切都开始正常工作了。

以上是关于Visual Studio 2008 表单设计器弄乱了布尔属性值的主要内容,如果未能解决你的问题,请参考以下文章

在visual studio 2008中运行时,表单不显示更改

Visual Studio 2008 表单继承和泛型加载失败

C++ Visual Studio 2008 中未声明的标识符

是否可以在 Visual Studio 2010 中调用 s-s-rS 2008 R2 报告?

如何停止 Visual Studio 为设计器中的控件生成属性设置?

Visual Studio 2008 Windows 窗体设计器如何兼容 QVGA 和 VGA?