Самый простой способ редактировать коллекцию в DesignMode? - PullRequest
3 голосов
/ 27 июня 2011

Какой самый простой способ отредактировать и сохранить коллекцию наподобие 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; }
      }
}

Теперь я попробовал всевозможные вещи, основанные на ответах здесь на stackoverflow и безошибочный на codeproject.com:

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 28 июня 2011

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

Пример со свойством 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; }
}
...