【问题标题】:Simplest way to edit a collection in DesignMode?在设计模式中编辑集合的最简单方法?
【发布时间】:2011-06-27 12:44:19
【问题描述】:

在 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 上的文章尝试了各种事情:

  • ArrayEditor 带小数[] 字段
  • MyObject 的自定义类型转换器
  • List 的自定义集合类
  • 容器类的读/写属性
  • 带有 EditValue 实现的自定义编辑器
  • 为 MyObject 实现 IComponent 接口
  • 尝试添加 DesignerSerializationVisibility(DesignerSerializationVisibility.Content)

我确实让它工作了,所以

  • 集合在 DesignMode 中可见
  • 集合可在设计模式中编辑
  • 可以在设计模式中将新项目添加到集合中

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

编辑: Hans 给了我一些提示(他的 cmets 不知何故进入了虚空)。我遵循了他的指导方针并更新了上面的源代码,不幸的是仍然无法正常工作......

【问题讨论】:

    标签: c# .net vb.net winforms designmode


    【解决方案1】:

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

    或者,如果你可以公开一个 string[] 然后这样做...

        [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; }
        }
    

    【讨论】:

    • 太棒了!那行得通 :) 这不是我想要的 CollectionEditor,但我会启动 Reflector 并检查我在实现中到底做错了什么..
    【解决方案2】:

    对象列表属性示例:


    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; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 2010-11-15
      • 1970-01-01
      相关资源
      最近更新 更多