Самый простой способ редактировать коллекцию в DesignMode?

Какой самый простой способ отредактировать и сохранить коллекцию как decimal[] или же List<string> в конструкторе WinForms?

Первая проблема заключается в том, что нужен конструктор без параметров. Поэтому я сделал простой класс-обёртку: (в какой-то момент это было похоже на 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; }
      }
}

Теперь я попробовал все виды вещей, основанные на ответах здесь на stackru и articless на codeproject.com:

  • ArrayEditor с десятичным полем []
  • Пользовательский TypeConverter для MyObject
  • Класс Custom Collection для Списка
  • Чтение / запись свойства в классе контейнера
  • Пользовательский редактор с реализацией для EditValue
  • Реализовать интерфейс IComponent для MyObject
  • Попытка добавления DesignerSerializationVisibility(DesignerSerializationVisibility.Content)

Я заставил его работать так, чтобы

  • Коллекция видна в DesignMode
  • Коллекция доступна для редактирования в DesignMode
  • Новые элементы могут быть добавлены в коллекцию в DesignMode

Однако при сохранении, закрытии и повторном открытии формы элементы в коллекции никогда не сохраняются.

Изменить: Ганс дал мне несколько советов (его комментарии как-то ушли в пустоту). Я следовал его указаниям и обновил приведенный выше источник, который, к сожалению, до сих пор не работает...

2 ответа

Решение

Я рекомендую, чтобы, если возможно, вы выставили свойство коллекций того же типа, что и тот, который уже использовался в платформе, и вы можете повторно использовать существующий редактор коллекций. Например, если вы используете класс 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; }
    }

Пример со свойством List of Objects:


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; }
}
Другие вопросы по тегам