c# – 以基本形式定义的自定义属性在重建时以继承的形式丢失其状态
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 以基本形式定义的自定义属性在重建时以继承的形式丢失其状态,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3670字,纯文字阅读大概需要6分钟。
内容图文
![c# – 以基本形式定义的自定义属性在重建时以继承的形式丢失其状态](/upload/InfoBanner/zyjiaocheng/826/9ee0f296daf54b48abe3daed45a975c7.jpg)
我遇到基本形式的属性无法以继承形式维护状态的问题.
环境:
> Visual Studio 2010 Ultimate Service Pack 1:版本10.0.40219.1 SP1Rel
> .Net Framework:版本4.0.30319 SP1Rel
> Windows 7旗舰版
下面是重现的源代码和步骤:
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace Test
{
public partial class BaseForm : Form
{
[DefaultValueAttribute(true)]
public bool ControlVisible
{
get
{
return this.checkBox1.Visible;
}
set
{
this.checkBox1.Visible = value;
}
}
[DefaultValueAttribute(false)]
public bool ControlChecked
{
get
{
return this.checkBox1.Checked;
}
set
{
this.checkBox1.Checked = value;
}
}
public BaseForm()
{
InitializeComponent();
}
}
}
在上面,默认属性与[DefaultValueAttribute]匹配,即在InitializeComponent()中,checkBox1.Visible设置为true,checkBox1.Checked为false.这些是放在表单上时控件的默认设置.
然后我创建了以下继承的表单:
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace Test
{
public partial class Form1 : BaseForm
{
public Form1()
{
InitializeComponent();
}
}
}
问题和重现步骤:
>当我在设计器中打开Form1时,属性处于以下状态.
状态:ControlChecked = False – ControlVisible = True(粗体)
ControlVisible按预期设置为True,但它是粗体. [DefaultValueAttribute]在基本表单中设置为true,因此我希望此属性不以粗体显示.
>我现在在设计器中将ControlVisible更改为False.大胆的关闭.
状态:ControlChecked = False – ControlVisible = False
>我现在重建项目,并重新生成Form1中的代码. ControlVisible属性以粗体还原为True.
状态:ControlChecked = False – ControlVisible = True(粗体)
>我现在将ControlChecked从False更改为True,并按预期变为粗体.
状态:ControlChecked = True(粗体) – ControlVisible = True(粗体)
>我重建项目,没有变化.
状态:ControlChecked = True(粗体) – ControlVisible = True(粗体)
>我现在将ControlVisible的属性从True更改为False并再次重建项目. ControlVisible以粗体显示回到True.
状态:ControlChecked = True(粗体) – ControlVisible = True(粗体)
ControlChecked似乎按预期工作.当ControlVisible设置为false并且反转粗体时,它会一直向后翻转.在我看来,无法识别基本形式中的[DefaultAttributeValue]为true.
更新:
修改以修复错误,更准确地隔离问题.
更新:
如果我在BaseForm的构造函数中设置checkBox1.Visible = false,那么一切都按预期工作.因此,最重要的是,似乎问题是在继承的表单中的自定义属性上识别为DefaultValueAttribute为true.
解决方法:
你的checkBox1在基类中是私有的吗?如果它不是那么应该是,因为设计者将序列化两个setter(一个用于checkBox1.Visible而另一个用于ControlVisible),并且只有序列化的顺序将决定最终状态,这是不好的.
另外,查看Form1.designer.cs文件中的自动生成的InitializeControls方法,是否将自定义属性显式设置为默认值?
最后,尝试使用ShouldSerialze and Reset,看看你是否有不同的行为.
编辑
我在本地重新创建了问题,并附加了一个VS实例来调试另一个.第一次由VS评估属性ControlVisible时,它返回false,因为checkBox1.Visible(getter源)为false.当创建并显示实际的复选框控件,并且滚动属性窗口以显示ControlVisible时,它的值再次被评估,并且它返回true,这是默认值,但是似乎VS内部已经标记了该属性被修改,因为它是初始的值与默认值不同.这可能是VS中的一个错误.
我创建了一个简单的效果演示:
public BaseForm()
{
InitializeComponent();
_testValue = false;
}
private bool _testValue;
[DefaultValue(true)]
public bool TestProperty
{
get { return _testValue; }
set { _testValue = value; }
}
protected override void OnVisibleChanged(EventArgs e)
{
_testValue = true;
base.OnVisibleChanged(e);
}
}
继承上面的BaseForm时,TestPropery的行为与示例中的ControlVisible完全相同,所以我认为这是VS中的一个错误.
你的问题的解决方案是使用一个简单的bool支持字段作为帮助,因为checkBox1.Visible是不可靠的:
public BaseForm()
{
InitializeComponent();
checkBox1.Visible = _controlVisible = true;
}
private bool _controlVisible;
[DefaultValue(true)]
public bool ControlVisible
{
get { return _controlVisible; }
set { _controlVisible = checkBox1.Visible = value; }
}
内容总结
以上是互联网集市为您收集整理的c# – 以基本形式定义的自定义属性在重建时以继承的形式丢失其状态全部内容,希望文章能够帮你解决c# – 以基本形式定义的自定义属性在重建时以继承的形式丢失其状态所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。