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 报告?