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