当前位置: 首页 > 编程语言 > C#

如何让Collection类型的用户控件属性在窗体设计器中可编辑?Share

时间:2023-04-10 16:26:38 C#

如何让Collection类型的用户控件属性在表单设计器中可编辑?今天在课堂上,我偶然发现了一个让我抓狂的问题。基本上我的目标是:我有一个UserControl1,它有一个Collection类型的字段和一个相应的属性CollectionProp。像这样:publicclassUserControl1:UserControl{privateCollectionfield=null;//后来改为://privateCollectionfield=newCollection();[Category("Data")][DefaultValue(null)][Description("asdf")]publicCollectionprop{get{返回字段;}设置{字段=值;}}}//后来添加://[Serializable]publicclassClass1{privateboolbooltest;publicboolBooltest{get...set...}privateintinttest;publicintInttest{get...set...}}如果您已经知道我搞砸了什么:无需阅读其余内容。我会描述我到底做了什么。现在我将一个UserControl放到一个随机窗体上并更改Prop属性。将出现一个通用的“集合编辑器”,类似于列表视图控件中的列和组。我可以按预期输入数据。但是,当我单击“确定”时,数据消失了。我花了一个多小时才弄清楚我实际上必须实例化我的字段:privateCollectionfield=newCollection();.很好,只有设计师进入了超级模式。层叠的噩梦错误消息可以简化为:“您必须将[Serializable]放在Class1之前。”这样做之后,我实际上可以再次将我的UserControl1放在窗体上。但这只有效一次。在编辑内容时打开我使用UserControl1的窗体设计器时,它给出了一个错误:“userctltest.Class1[]”类型的对象无法转换为“userctltest.Class1[]”类型。好的。错误列表显示:警告:无法将“userctltest.Class1[]”类型的ResX文件对象转换为“userctltest.Class1[]”类型。第134行,位置5.无法解析。Designer尝试从resx文件中获取Property数据。删除resx文件“解决”一次。现在可以使用UserControl1再次显示窗体。集合属性是可编辑的并且正在保存。有用。一次。每当我更改某些内容然后尝试再次打开窗体的设计器时,上述错误就会再次出现。我可以删除resx文件,当然这也会删除我的数据。到目前为止对我有帮助的相关资源(在大量不太有用的搜索结果中):http://www.codeproject.com/Answers/190675/Usercontrol-with-custom-class-property#answer1http://www.codeproject.com/KB/cs/propertyeditor.aspxhttp://www.csharpfriends.com/Articles/getArticle.aspx?articleID=94http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx(我也尝试实现ISerializable并覆盖GetObjectData{info.AddValue("testbool",testbool);info.AddValue("testint",testint);}也没有帮助(我也试过属性名称而不是字段名称))很抱歉把它写成一本糟糕的恐怖小说顺便说一句。您需要的是对CodeDom序列化的设计时支持。您不需要SerializableAttribute或ISerializable,它们用于二进制序列化。由于您正在序列化一个集合,因此您必须告诉设计者对其进行序列化。这是使用DesignerSerializationVisibiliby属性完成的-Content值告诉设计者序列化属性内容而不是属性本身。对于具有简单属性的简单类,此属性的内容当然应该是CodeDom可序列化的。因此,如果您像这样更改UserControl1类:publicclassUserControl1:UserControl{privateCollectionfield=newCollection();[Category("Data")][Description("asdf")][DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]publicCollectionprop{get{returnfield;}}}...它应该可以解决问题。哦,集合属性通常是不可写的,尽管这不是强制性的。但是序列化程序期望初始化集合属性,这就是必须为字段添加初始化的原因。另请注意,如果您不希望属性在属性编辑器中被标记为粗体,您可以通过特殊方法ShouldSerializePropertyName指定更复杂的“默认值”,它甚至可以是私有的。像这样:privateboolShouldSerializeprop(){return(field.Count>0);现在你的属性只有在不为空时才会显示为粗体。但我离题了,这不是问题:)完美的例子是这样的:publicpartialclassSCon:UserControl{publicSCon(){InitializeComponent();if(Persoanas==null){Persoanas=newList();}}[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]publicListPersoanas{get;放;}}[可序列化]publicclassPersoan{publicintId{get;放;}公共字符串名称{得到;放;}}只是改变Collection以上是List的C#学习教程:如何让Collection类型的用户控件属性在表单设计器中可编辑?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: