Как сделать свойство элемента управления пользователя типа Collection редактируемым в конструкторе форм?

Сегодня на работе я наткнулся на проблему, которая сводила меня с ума.

В основном моя цель такова:

У меня есть UserControl1 с полем типа Collection и соответствующим свойством Collection Опора . Как это:

public class UserControl1 : UserControl
{
    private Collection field = null;
    // later changed to:
    //private Collection field = new Collection();
    [Category("Data")]
    [DefaultValue(null)]
    [Description("asdf")]
    public Collection prop
    {
        get { return field; }
        set { field = value; }
    }
}
// later added:
//[Serializable]
public class Class1
{
    private bool booltest; public bool Booltest { get...set...}
    private int inttest; public int Inttest { get...set...}
}

Если вы уже знаете, что я напортачил: остальное читать не нужно. Я опишу, что именно я сделал.

Теперь я помещаю UserControl в случайную форму и изменяю свойство Prop . Появится универсальный «Редактор коллекции», подобный тому, который используется для столбцов и групп в элементе управления списком. Я могу ввести данные, как и ожидалось. Однако, когда я нажимаю ОК, данные исчезают.

Мне потребовалось больше часа, чтобы понять, что мне действительно нужно создать экземпляр своего поля: private Collection field = new Collection (); . Очень хорошо, только то, что конструктор перешел в супер-пазл-режим. Каскадное кошмарное сообщение об ошибке, которое можно свести к следующему: «Вы должны поместить [Serializable] перед своим Class1 ». После этого я мог снова поместить свой UserControl1 в форму.

Но это работает только один раз. При открытии конструктора формы, где я использую UserControl1 после редактирования чего-либо, он выдает ошибку:

Объект типа userctltest.Class1 [] не может быть преобразован в тип userctltest.Class1 [] '.

Хорошо. В списке ошибок указано:

Предупреждение: объект файла ResX типа «userctltest.Class1 []» не может быть преобразован в тип «userctltest.Class1 []». Строка 134, позиция 5. не может быть проанализирована.

Дизайнер пытается получить данные о свойстве из файла resx. Удаление файла resx "решает" это ровно один раз.

Форма теперь может быть снова отображена с моим UserControl1 . Свойство коллекции доступно для редактирования , и оно сохраняется. Это действительно работает. Один раз. Всякий раз, когда я что-то меняю, а затем снова пытаюсь открыть конструктор форм, снова возникает указанная выше ошибка. Я могу удалить файл resx, но это, конечно, также удалит мои данные.

Соответствующие ресурсы, которые помогли мне до сих пор (среди множества не очень полезных результатов поиска):

http://www.codeproject.com/Answers/190675/Usercontrol-with-custom-class-property#answer1
http://www.codeproject.com/KB/cs/propertyeditor.aspx
http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=94
http: // msdn .microsoft.com / en-us / library / system.runtime.serialization.iserializable.aspx

(Я также пробовал реализовать ISerializable и переопределить GetObjectData с помощью

{info.AddValue ("testbool", testbool); info. AddValue ("testint", testint);}

тоже не помогло (я также пробовал использовать имена свойств вместо имен полей))

Извините, что пишу это как плохой роман ужасов, кстати.

13
задан dialer 15 September 2011 в 20:21
поделиться