今天上班时,我偶然发现了一个让我疯狂的问题。
基本上我的目标是:
我有一个 UserControl1
,具有该类型的字段 Collection<Class1>
和相应的财产 Collection<Class1> Prop
。喜欢这个:
public class UserControl1 : UserControl
{
private Collection<Class1> field = null;
// later changed to:
//private Collection<Class1> field = new Collection<Class1>();
[Category("Data")]
[DefaultValue(null)]
[Description("asdf")]
public Collection<Class1> prop
{
get { return field; }
set { field = value; }
}
}
// later added:
//[Serializable]
public class Class1
{
private bool booltest; public bool Booltest { get...set...}
private int inttest; public int Inttest { get...set...}
}
如果你已经知道我搞砸了什么:不需要阅读其余部分。 我将描述我到底做了什么。
现在我把它 UserControl
到一个随机的表格并改变 Prop
属性。将出现一个通用的“集合编辑器”,类似于listview控件中的列和组。我可以按预期输入数据。但是,当我单击“确定”时,数据消失了。
我花了一个多小时才发现我实际上必须实例化我的字段: private Collection<MyClass> field = new Collection<MyClass>();
。非常好,只有设计师进入了超级模式。级联噩梦错误信息可以简化为:“你必须把 [Serializable]
在你之前 Class1
“这样做后,我真的可以把我的 UserControl1
再次在表格上。
但那只能工作一次。打开我使用的表单的设计者时 UserControl1
编辑之后,它给了我一个错误:
Object of type 'userctltest.Class1[]' cannot be converted to type 'userctltest.Class1[]'.
好。错误列表说:
Warning: ResX file Object of type 'userctltest.Class1[]' cannot be converted to type 'userctltest.Class1[]'. Line 134, position 5. cannot be parsed.
设计者尝试从resx文件中获取Property的数据。删除resx文件“解决”一次。
表格现在可以再次显示,我的 UserControl1
。 Collection属性 是 可编辑的,它正在被保存。它确实有效。一旦。每当我更改某些内容然后再次尝试打开Form的设计器时,会再次出现上述错误。我可以删除resx文件,但这当然也会删除我的数据。
到目前为止帮助我的相关资源(在大量不太有用的搜索结果中):
http://www.codeproject.com/Answers/190675/Usercontrol-with-custom-class-property#answer1
http://www.codeproject.com/KB/cs/propertyeditor.aspx
http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=94
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx
(我也试过实现ISerializable并重写GetObjectData
{ info.AddValue("testbool", testbool); info.AddValue("testint", testint); }
也没有帮助(我也尝试了属性名称而不是字段名称))
对不起写这个像坏恐怖小说顺便说一句。