Доброе время суток всем метрам .Net.
Появилась проблема с которой не могу справиться сам .
Необходимо добавить к компоненту колекци. Написал тестовый пример
все как бы правильно но после того как в дизайнере добавил элементы
колекции и зделал билд — колекция очистилась и
элементы колекции в коде не создались. Атрибуты пропсисал,
конвертор тоже сделал, а в чом глюк не могу понять . Перерыл уже все
что можно и в МСДН посмотрел, и на данном форуме, результат отрицательный
Буду благодарен за любую подсказку. Зарание спасибо!
вот пример кода:
// Компонентpublic class TMComponent : Component
{
public TMComponent(){}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public TMCollection Parameters
{
get
{
if (FCollection == null)
return FCollection = new TMCollection();
else
return FCollection;
}
}
private TMCollection FCollection;
}
// Колекцияpublic class TMCollection : CollectionBase
{
public TMCollection(){}
public void Add (TMItem value)
{
this.List.Add(value);
}
public void Remove (int index)
{
this.List.RemoveAt(index);
}
public TMItem this[int index]
{
get{return ((TMItem)this.List[index]);}
set{ List[index] = value;}
}
public TMItem Element
{
get
{
if (FItem == null)
return FItem = new TMItem();
else return FItem;
}
set{FItem = value;}
}
private TMItem FItem;
}
// Элемент колекции
[TypeConverter(typeof(TMConvert)), Serializable()]
public class TMItem : Component
{
public TMItem(){}
public string Text
{
get{ return FText; }
set{ FText = value; }
}
public int Size
{
get{ return FSize; }
set{ FSize = value; }
}
private string FText;
private int FSize;
}
// Конвертор public class TMConvert : TypeConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
if(destinationType == typeof(InstanceDescriptor))
{
return true;
}
return base.CanConvertTo (context, destinationType);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
ConstructorInfo info;
TMItem element;
Type[] array_type;
object[] array_obj;
if(destinationType == typeof(InstanceDescriptor))
{
array_type = new Type[2];
array_type[0] = typeof(int);
array_type[1] = typeof(string);
info = typeof(TMItem).GetConstructor(array_type);
element = (TMItem)value;
array_obj = new object[2];
array_obj[0] = element.Size;
array_obj[1] = element.Text;
return new InstanceDescriptor(info, array_obj);
}
return base.ConvertTo (context, culture, value, destinationType);
}
}
Здравствуйте, nbb, Вы писали:
nbb>Доброе время суток всем метрам .Net. nbb>Появилась проблема с которой не могу справиться сам . nbb>Необходимо добавить к компоненту колекци. Написал тестовый пример nbb>все как бы правильно но после того как в дизайнере добавил элементы nbb>колекции и зделал билд — колекция очистилась и nbb>элементы колекции в коде не создались. Атрибуты пропсисал, nbb>конвертор тоже сделал, а в чом глюк не могу понять . Перерыл уже все nbb>что можно и в МСДН посмотрел, и на данном форуме, результат отрицательный nbb>Буду благодарен за любую подсказку. Зарание спасибо! nbb>вот пример кода:
<skipped>
Такое бывает, если тестовая форма и тестируемый компонент находятся в одной сборке.
Здравствуйте, ForestLabs, Вы писали:
FL>Такое бывает, если тестовая форма и тестируемый компонент находятся в одной сборке.
Спасибо вы действительно были правы
Но как с этим боротся ? В данный момент у меня в солюшене 2 проекта мой компонент и тестовый WinApp.
А теперь что, открывать 2 студии в одной компонент править а во-второй тестировать ?
Здравствуйте, nbb, Вы писали:
nbb>Здравствуйте, ForestLabs, Вы писали:
FL>>Такое бывает, если тестовая форма и тестируемый компонент находятся в одной сборке.
nbb>Спасибо вы действительно были правы nbb>Но как с этим боротся ? В данный момент у меня в солюшене 2 проекта мой компонент и тестовый WinApp. nbb>А теперь что, открывать 2 студии в одной компонент править а во-второй тестировать ?
Оп-па!
Я ведь посоветовал как раз то, что у Вас есть — "у меня в солюшене 2 проекта мой компонент и тестовый WinApp".
Получается, в такой среде не работает? У меня как раз проблемы были с однопроекными солюшенами.
Что тут посоветовать —
1. Выйти из Студии
2. Удалить все папки bin и obj
3. Иногда не мешает удалить файл <имя_солюшена>.suo
4. Убедится, что референс стоит на проект, а не на бинарник
5. Достать, наконец, бубен...
Успехов!
P.S. После решения проблемы прошу сообщить народу пути.
FL>Что тут посоветовать — FL>1. Выйти из Студии FL>2. Удалить все папки bin и obj FL>3. Иногда не мешает удалить файл <имя_солюшена>.suo FL>4. Убедится, что референс стоит на проект, а не на бинарник FL>5. Достать, наконец, бубен...
А что вы подразумеваете од вот этим:
FL>4. Убедится, что референс стоит на проект, а не на бинарник
я делал так добавил в ToolBox свой компонент сославшись на dll,
и кинул его на форму.Меняю чтото в библиотеку, билд, смотрю на результат в WinApp
Поправте если я чото не так делаю. До этого компоненты не писал. может и намудрил.
Остальные перечисленые пункты ничего не дали Надо искать бубен
Здравствуйте, nbb, Вы писали: nbb>А что вы подразумеваете од вот этим:
FL>>4. Убедится, что референс стоит на проект, а не на бинарник
nbb>я делал так добавил в ToolBox свой компонент сославшись на dll, nbb>и кинул его на форму.Меняю чтото в библиотеку, билд, смотрю на результат в WinApp nbb>Поправте если я чото не так делаю. До этого компоненты не писал. может и намудрил. nbb>Остальные перечисленые пункты ничего не дали Надо искать бубен
Отвечаю:
— лезем в референсы WinApp и удаляем ссылку на dll, в которой компонент
— потом добавляем ссылку на проект (в диалоге 'Add Reference' есть закладка 'Projects')
Здравствуйте, ForestLabs, Вы писали:
FL>Отвечаю: FL>- лезем в референсы WinApp и удаляем ссылку на dll, в которой компонент FL>- потом добавляем ссылку на проект (в диалоге 'Add Reference' есть закладка 'Projects')
Пасибо.
Проблему решил ! Ошибка заключалась совсем не там где искал.
Неправильно был реализован ConvertTo. Для сохранения свойста Size и Text
при таком конветроре необходимо дописать еще один конструктор для класа
TMItem