Сегодня на работе я наткнулся на проблему, которая сводила меня с ума.
В основном моя цель такова:
У меня есть 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
. Очень хорошо, только то, что конструктор перешел в супер-пазл-режим. Каскадное кошмарное сообщение об ошибке, которое можно свести к следующему: «Вы должны поместить [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);}
тоже не помогло (я также пробовал использовать имена свойств вместо имен полей))
Извините, что пишу это как плохой роман ужасов, кстати.