在DesignMode中编辑集合的最简单方法是什么?

在WinForms设计器中编辑和保存像decimal[]List这样的集合的最简单方法是什么?

第一个问题是需要无参数构造函数。 所以我创建了一个简单的包装类:(在某些时候,这就像MyObject ,但是WinForms designercode生成器不知道如何处理它)

 [Serializable()] public class MyObject { public MyObject() {} public decimal Value {get; set;} } 

在容器类中,我们定义一个属性并为其添加CollectionEditor属性:

 public class MyContainer { private List _col = new List(); [Editor(typeof(CollectionEditor), typeof(System.Drawing.Design.UITypeEditor))] public List Collection { get { return _col; } set { _col = value; } } } 

现在我基于stackoverflow上的答案尝试了各种各样的东西,并在codeproject.com上无法解决:

  • 带有decimal []字段的ArrayEditor
  • MyObject的自定义TypeConverter
  • 列表的自定义集合类
  • 容器类上的读/写属性
  • 具有EditValue实现的自定义编辑器
  • 为MyObject实现IComponent接口
  • 尝试添加DesignerSerializationVisibility(DesignerSerializationVisibility.Content)

我确实让它工作了

  • 该集合在DesignMode中可见
  • 该集合可在DesignMode中编辑
  • 可以在DesignMode中将新项添加到集合中

但是,通过保存,关闭和重新打开表单,集合中的元素永远不会保留。

编辑:汉斯给了我一些提示(他的评论不知何故进入了虚空)。 我遵循了他的指导方针并更新了上面的来源,遗憾的是仍然无效……

我建议如果可能的话,您公开一个与框架中已经使用的类型相同的集合属性,这样您就可以重用现有的集合编辑器。 例如,如果您使用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; } } 

对象列表属性的示例:


 public partial class SCon : UserControl { public SCon() { InitializeComponent(); if (Persoanas == null) { Persoanas = new List(); } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public List Persoanas { get; set; } } [Serializable] public class Persoan { public int Id { get; set; } public String Name { get; set; } }