我目前正在使用C#构建.Net用户表单,我使用自定义用户控件填充它。每个控件都有一个访问器,用于获取和设置包含控件将填充的数据的对象。
在运行时,一切都很好,但在设计时我会在表单设计器中出错。错误总是沿着“无法将[ObjectA]类型的对象转换为[ObjectA]类型的对象”
此时,我可以进入resx文件并删除引用ObjectA类型对象的行,然后进入designer.cs文件并删除InitializeComponent中的行,该行将控件的访问者设置为数据来自resx文件。
完成后,表单将显示在设计器中,直到它重建InitializeComponet并将行/数据重新插入resx和InitializeComponent。
我的控制和课程设计中缺少什么才能结束这个循环?我尝试使用Liscence Usage模式和Designer运行时模式,结果好坏参半,如果我能在设计中解决这个问题,我会更喜欢它。
感谢您提供的任何帮助。
更新:我添加了属性...
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
对于属性我在设计器中遇到错误“ObjectA为null,这是不允许的!”,所以我将行改为...
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
问题消失了。由于我不需要在设计时设置任何这些属性,因此隐藏属性可能更合适。
感谢。
答案 0 :(得分:2)
听起来它可能是对象被序列化的方式。
设计人员正在将对象二进制序列化到resx文件中,您可能需要的是在.Designer.cs文件中生成的代码。
尝试在属性上添加以下属性行: [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
答案 1 :(得分:0)
以下是用户控件中设计时感知代码的示例:
protected override void OnPaintBackground(PaintEventArgs e)
{
if (this.DesignMode)
{
base.OnPaintBackground(e);
}
}
这可能不适合你,但是如果你在“if(**!** this.DesignMode){}”块中包装任何有问题的代码,你应该没问题(除非你需要控件的代码到在设计模式下正确渲染。)