在WinForms设计器中编辑和持久像decimal[]
或List<string>
这样的集合的最简单方法是什么?
第一个问题是需要无参数构造函数。所以我做了一个简单的包装类:
(在某些时候这就像MyObject<T>
,但WinForms设计器代码生成器不知道如何处理它)
[Serializable()]
public class MyObject
{
public MyObject() {}
public decimal Value {get; set;}
}
在容器类中,我们定义一个属性并将CollectionEditor属性添加到它:
public class MyContainer
{
private List<MyObject> _col = new List<MyObject>();
[Editor(typeof(CollectionEditor), typeof(System.Drawing.Design.UITypeEditor))]
public List<MyObject> Collection
{
get { return _col; }
set { _col = value; }
}
}
现在我根据stackoverflow上的答案尝试了各种各样的东西,并在codeproject.com上无法解决:
我确实让它发挥作用
但是,通过保存,关闭和重新打开表单,集合中的元素永远不会保留。
修改 汉斯给了我一些提示(他的评论不知何故进入了虚空)。我遵循了他的指导方针并更新了上面的来源,遗憾的是仍然无效...
答案 0 :(得分:4)
我建议您尽可能公开一个与框架中已使用的类型相同的集合属性,这样您就可以重用现有的集合编辑器。例如,如果您使用 StringCollection 类,则可以执行以下操作并重用WinForms现有编辑器...
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Editor("System.Windows.Forms.Design.StringCollectionEditor,
System.Design, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
public StringCollection Items
{
get { return _myStringCollection; }
}
或者,如果您可以公开字符串[] ,那么请执行此操作...
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Editor("System.Windows.Forms.Design.StringArrayEditor,
System.Design, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
public string[] Lines
{
get { return _myStringArray; }
set { myStringArray = value; }
}
答案 1 :(得分:1)
对象列表属性的示例:
public partial class SCon : UserControl
{
public SCon()
{
InitializeComponent();
if (Persoanas == null)
{
Persoanas = new List<Persoana>();
}
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Persoan> Persoanas { get; set; }
}
[Serializable]
public class Persoan
{
public int Id { get; set; }
public String Name { get; set; }
}