构建.Net用户控件

时间:2008-11-25 21:47:38

标签: .net visual-studio user-controls

我目前正在使用C#构建.Net用户表单,我使用自定义用户控件填充它。每个控件都有一个访问器,用于获取和设置包含控件将填充的数据的对象。

在运行时,一切都很好,但在设计时我会在表单设计器中出错。错误总是沿着“无法将[ObjectA]类型的对象转换为[ObjectA]类型的对象”

此时,我可以进入resx文件并删除引用ObjectA类型对象的行,然后进入designer.cs文件并删除InitializeComponent中的行,该行将控件的访问者设置为数据来自resx文件。

完成后,表单将显示在设计器中,直到它重建InitializeComponet并将行/数据重新插入resx和InitializeComponent。

我的控制和课程设计中缺少什么才能结束这个循环?我尝试使用Liscence Usage模式和Designer运行时模式,结果好坏参半,如果我能在设计中解决这个问题,我会更喜欢它。

感谢您提供的任何帮助。

更新:我添加了属性...

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]

对于属性我在设计器中遇到错误“ObjectA为null,这是不允许的!”,所以我将行改为...

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

问题消失了。由于我不需要在设计时设置任何这些属性,因此隐藏属性可能更合适。

感谢。

2 个答案:

答案 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){}”块中包装任何有问题的代码,你应该没问题(除非你需要控件的代码到在设计模式下正确渲染。)