.Net – классы, компоненты и контролы
От: Владислав Чистяков Российская Империя www.nemerle.org
Дата: 21.07.03 03:50
Оценка: 863 (29)
Статья:
.Net – классы, компоненты и контролы
Автор(ы): Владислав Чистяков
Дата: 09.05.2003
Создание ПО из компонентов подразумевает, что компоненты будут добавляться к проекту во время разработки. При этом будет производиться их начальная настройка. Компоненты как таковые не подразумевают (вернее сказать, не обязаны иметь) пользовательского интерфейса (ни для программиста, ни для конечного пользователя). В этом качестве выступают части IDE и дополнительные программные дизайнеры. Первой компонентной средой был продукт, купленный Microsoft на заре своего существования. Впоследствии на его базе родился VB. Далее была Delphi… в общем, к концу двадцатого века компоненты стали поддерживаться почти везде (даже в Visual C++, хотя он и по сей день не очень-то визуальный).


Авторы:
Владислав Чистяков

Аннотация:
Создание ПО из компонентов подразумевает, что компоненты будут добавляться к проекту во время разработки. При этом будет производиться их начальная настройка. Компоненты как таковые не подразумевают (вернее сказать, не обязаны иметь) пользовательского интерфейса (ни для программиста, ни для конечного пользователя). В этом качестве выступают части IDE и дополнительные программные дизайнеры. Первой компонентной средой был продукт, купленный Microsoft на заре своего существования. Впоследствии на его базе родился VB. Далее была Delphi… в общем, к концу двадцатого века компоненты стали поддерживаться почти везде (даже в Visual C++, хотя он и по сей день не очень-то визуальный).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: .Net – классы, компоненты и контролы
От: Воронков Василий Россия  
Дата: 21.07.03 06:56
Оценка: +1
Здравствуйте, Владислав Чистяков, Вы писали:

В конце статьи кто-то обещал продолжение. А так как статья вышла уже энное время назад, то возникает естестественный вопрос.
... << RSDN@Home 1.1 beta 1 >>
Re: .Net – классы, компоненты и контролы
От: Ed.ward Россия  
Дата: 31.07.03 13:40
Оценка:
Здравствуйте, Владислав Чистяков, Вы писали:

ВЧ>Статья:

ВЧ>.Net – классы, компоненты и контролы

ВЧ>Авторы:

ВЧ> Владислав Чистяков

ВЧ>Аннотация:

ВЧ>Создание ПО из компонентов подразумевает, что компоненты будут добавляться к проекту во время разработки. При этом будет производиться их начальная настройка. Компоненты как таковые не подразумевают (вернее сказать, не обязаны иметь) пользовательского интерфейса (ни для программиста, ни для конечного пользователя). В этом качестве выступают части IDE и дополнительные программные дизайнеры. Первой компонентной средой был продукт, купленный Microsoft на заре своего существования. Впоследствии на его базе родился VB. Далее была Delphi… в общем, к концу двадцатого века компоненты стали поддерживаться почти везде (даже в Visual C++, хотя он и по сей день не очень-то визуальный).

В статье рассказывается как создавать виртуальные свойства у компонентов в design time.
Вопрос как создать виртуальные свойства НЕ у компонента, то есть у произвольного класса.

Конкретно: хочу написать свой UITypeEditor для кисти, что бы свойство типа Brush можно было настраивать в PropertyGrid'е. Видится мне это так — Expandable object в котором есть комбобокс с возможными типами кисти и изменяющийся набор виртуальных свойств в зависимости от выбранного типа.

Спасибо за любую помощь.

Ed.ward
Re[2]: .Net – классы, компоненты и контролы
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.08.03 19:37
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, Владислав Чистяков, Вы писали:


ВВ>В конце статьи кто-то обещал продолжение. А так как статья вышла уже энное время назад, то возникает естестественный вопрос.


Как то вдохновение не находит. К тому, же орлы из Редмонда уже многое сделали в этом направлении (в MSDN Magazine вышла пара статей в этом же духе).

В общем, если читатели сформулируют, что они хотели бы видеть в продолжении, может вдохновение и вернется. Пока думаю сделать статейку не о контролах, а о контейнере. Так сказать взгляд с другой стороны. Мне кажется, это будет куда нагляднее. Вот только объем работы очень большой. И сложность статьи тоже слишком велика (чистое грузилово).
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: .Net – классы, компоненты и контролы
От: Воронков Василий Россия  
Дата: 04.08.03 20:03
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>В общем, если читатели сформулируют, что они хотели бы видеть в продолжении, может вдохновение и вернется.


Ну кое-что можно накопать. Например, рассмотреть по-этапно создание к-нить интересного гуйного контрола. Или основные способы создания меню с картинками — я знаю по крайней мере три — типа плюсы-минусы и все такое. Может интересно получиться.

VD>Пока думаю сделать статейку не о контролах, а о контейнере. Так сказать взгляд с другой стороны. Мне кажется, это будет куда нагляднее. Вот только объем работы очень большой. И сложность статьи тоже слишком велика (чистое грузилово).


А в чем основная идея?
... << RSDN@Home 1.1 beta 1 >>
Re[4]: .Net – классы, компоненты и контролы
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.08.03 20:22
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Ну кое-что можно накопать. Например, рассмотреть по-этапно создание к-нить интересного гуйного контрола. Или основные способы создания меню с картинками — я знаю по крайней мере три — типа плюсы-минусы и все такое. Может интересно получиться.


Гы. Про контрол, я тоже так подумал. Создал простенький контрол (TreeGrid), но пока он создавался, он пережил полный редизайн и стал занимать 150 кил кода. Так что его описание займет пол журнала.

ВВ>А в чем основная идея?


Описать реализацию контейнера позволяющего хостить (настраивать/сериализовать/запускать) стандартные контролы. Там два момента: 1) кодогенерация (сериализация в код) и 2) дизантайм-опдсистема дизайнера.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: .Net – классы, компоненты и контролы
От: Воронков Василий Россия  
Дата: 04.08.03 20:25
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Гы. Про контрол, я тоже так подумал. Создал простенький контрол (TreeGrid), но пока он создавался, он пережил полный редизайн и стал занимать 150 кил кода. Так что его описание займет пол журнала.


Ну зачем так увлекаться? С теми же меню явно получится куда скромнее. Код, кстати, могу дать.

ВВ>>А в чем основная идея?

VD>Описать реализацию контейнера позволяющего хостить (настраивать/сериализовать/запускать) стандартные контролы. Там два момента: 1) кодогенерация (сериализация в код) и 2) дизантайм-опдсистема дизайнера.

Тулбар? Тоже есть, правда сырой.
... << RSDN@Home 1.1 beta 1 >>
Re[6]: .Net – классы, компоненты и контролы
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.08.03 20:30
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Ну зачем так увлекаться? С теми же меню явно получится куда скромнее. Код, кстати, могу дать.


Меню уже есть в Меджике. Сделать из них контрол дело техники.

ВВ>Тулбар? Тоже есть, правда сырой.


Так может сам и напишешь? А том меня тулбары не вдохновляют.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: .Net – классы, компоненты и контролы
От: Poudy Россия  
Дата: 05.08.03 09:19
Оценка:
Здравствуйте, Ed.ward, Вы писали:

EW>Конкретно: хочу написать свой UITypeEditor для кисти, что бы свойство типа Brush можно было настраивать в PropertyGrid'е. Видится мне это так — Expandable object в котором есть комбобокс с возможными типами кисти и изменяющийся набор виртуальных свойств в зависимости от выбранного типа.


EW>Спасибо за любую помощь.


EW>Ed.ward


Копай в сторону ICustomTypeDescriptor. Его реализацию надо передавать в качестве значения свойства Brush.
Т.е. что-то типа BrushWrapper(component.Brush), где BrushWrapper реализует ICustomTypeDescriptor.
Re[3]: .Net – классы, компоненты и контролы
От: Ed.ward Россия  
Дата: 05.08.03 09:25
Оценка:
Здравствуйте, Poudy, Вы писали:

P>Здравствуйте, Ed.ward, Вы писали:


EW>Конкретно: хочу написать свой UITypeEditor для кисти, что бы свойство типа Brush можно было настраивать в PropertyGrid'е. Видится мне это так — Expandable object в котором есть комбобокс с возможными типами кисти и изменяющийся набор виртуальных свойств в зависимости от выбранного типа.


EW>Спасибо за любую помощь.


EW>Ed.ward


P>Копай в сторону ICustomTypeDescriptor. Его реализацию надо передавать в качестве значения свойства Brush.

P>Т.е. что-то типа BrushWrapper(component.Brush), где BrushWrapper реализует ICustomTypeDescriptor.

То есть ты имеешь ввиду что в настраивамом объекте надо объявлять поле типа BrushWrapper, а не Brush и в нем инкапсулировать Brush?

Ed.ward
... << RSDN@Home 1.0 beta 7a >>
Re[4]: .Net – классы, компоненты и контролы
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.08.03 17:17
Оценка:
Здравствуйте, Ed.ward, Вы писали:

EW>То есть ты имеешь ввиду что в настраивамом объекте надо объявлять поле типа BrushWrapper, а не Brush и в нем инкапсулировать Brush?


Есть иного решений. Так можно сделать теневое свойство и в нем уже сделть подмену объекта на врапер. А можно и в самом объекте реализовать ICustomTypeDescriptor. Проперти-грид всегда пытается получить этот интерфейс от объекта и если это удается вся информация о типах ичитается через этот интерфейс.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: .Net – классы, компоненты и контролы
От: Олег Гашев
Дата: 18.09.03 20:02
Оценка:
Здравствуйте, VladD2, Вы писали:

О container можно написать реализацию wizard control. Кода не очень много. У меня в проекте 3 класса: PanelCollection, WizardControl, WizardControlDesigner. Можно добавить классы для реализации стандартных panels: WelcomePanel, SimplePanel, EndPanel, стандартные panels для инсталяции.

P.S. В статье не очень понятна реализация IMenuCommandService.
Либо я найду путь, либо проложу его. © Свифт
Re[5]: .Net – классы, компоненты и контролы
От: Аноним  
Дата: 18.09.03 21:04
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Воронков Василий, Вы писали:


ВВ>>Ну кое-что можно накопать. Например, рассмотреть по-этапно создание к-нить интересного гуйного контрола. Или основные способы создания меню с картинками — я знаю по крайней мере три — типа плюсы-минусы и все такое. Может интересно получиться.


VD>Гы. Про контрол, я тоже так подумал. Создал простенький контрол (TreeGrid), но пока он создавался, он пережил полный редизайн и стал занимать 150 кил кода. Так что его описание займет пол журнала.


ВВ>>А в чем основная идея?


VD>Описать реализацию контейнера позволяющего хостить (настраивать/сериализовать/запускать) стандартные контролы. Там два момента: 1) кодогенерация (сериализация в код) и 2) дизантайм-опдсистема дизайнера.


Ждём с нетерпением. Интересно было бы прочесть!
Re[8]: .Net – классы, компоненты и контролы
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 20.09.03 07:30
Оценка:
Здравствуйте, Олег Гашев, Вы писали:

ОГ>О container можно написать реализацию wizard control. Кода не очень много. У меня в проекте 3 класса: PanelCollection, WizardControl, WizardControlDesigner. Можно добавить классы для реализации стандартных panels: WelcomePanel, SimplePanel, EndPanel, стандартные panels для инсталяции.


Так может и напишешь? Я так понимаю реализация у тебя уже есть.

VladD2
... << RSDN@Home 1.1 beta 2 >>
AVK Blog
Re[9]: .Net – классы, компоненты и контролы
От: Олег Гашев
Дата: 20.09.03 16:59
Оценка:
Здравствуйте, AndrewVK, Вы писали:


AVK>Так может и напишешь? Я так понимаю реализация у тебя уже есть.


AVK>VladD2


Давай я тебе ответ дам через неделю, в воскресенье. Надо еще поработать над кодом. Не всё готово, но рабочий вариант уже есть.
Либо я найду путь, либо проложу его. © Свифт
Re[10]: .Net – классы, компоненты и контролы
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 21.09.03 15:33
Оценка:
Здравствуйте, Олег Гашев, Вы писали:

ОГ>Давай я тебе ответ дам через неделю, в воскресенье. Надо еще поработать над кодом. Не всё готово, но рабочий вариант уже есть.



Ждемс с нетерпением.

VladD2
... << RSDN@Home 1.1 beta 2 >>
AVK Blog
Re: .Net – классы, компоненты и контролы
От: Олег Гашев
Дата: 28.09.03 18:16
Оценка:
Здравствуйте, Владислав Чистяков, Вы писали:


Content – говорит сериализатору, что свойство должно сериализоваться «по содержимому». Это значение применяется для сериализации коллекций. Чтобы сериализовать свойство по содержимому, нужно, чтобы возвращаемый им объект реализовывал один из следующих методов:

public int Add(SomeElementType value);
public void AddRange(SomeElementType [] values) ;



Кроме этого объект должен реализовать интерфейсы IList и ICollection. Методы AddRange и Add определяются по имени и не имеют никакого отношения к этим интерфейсам.


Content используется не только для коллекций.
У меня Content используется для сериализации класса, который будет представлен в properties grid как expandable type.
Либо я найду путь, либо проложу его. © Свифт
Re[2]: .Net – классы, компоненты и контролы
От: SiAVoL Россия  
Дата: 29.09.03 05:46
Оценка:
Здравствуйте, Олег Гашев, Вы писали:

ОГ>Здравствуйте, Владислав Чистяков, Вы писали:



ОГ>

ОГ>Content – говорит сериализатору, что свойство должно сериализоваться «по содержимому». Это значение применяется для сериализации коллекций. Чтобы сериализовать свойство по содержимому, нужно, чтобы возвращаемый им объект реализовывал один из следующих методов:

ОГ>public int Add(SomeElementType value);
ОГ>public void AddRange(SomeElementType [] values) ;



ОГ>Кроме этого объект должен реализовать интерфейсы IList и ICollection. Методы AddRange и Add определяются по имени и не имеют никакого отношения к этим интерфейсам.


ОГ>Content используется не только для коллекций.

ОГ>У меня Content используется для сериализации класса, который будет представлен в properties grid как expandable type.

Так, вроде никто и не утверждал, что Content только для коллекций. Данный атрибут просто показывает сериалайзеру копнуть это свойство вглубь...
... << RSDN@Home 1.1 beta 2 >>
Re[3]: .Net – классы, компоненты и контролы
От: Grizzli  
Дата: 28.12.03 08:36
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>В общем, если читатели сформулируют, что они хотели бы видеть в продолжении, может вдохновение и вернется.


Здравствуйте.
Ну например проблема использования ActiveX компонентов на WinForms.
вот если кинуть MsFlexGrid На Net User контрол, а потом этот User контрол вставить в 3ий контрол MyContols, или вставить на несколько закладок Tab'а то при вызове Dispose формы с табом или контрола MyContols вылетают сообщения типа Windowless ActiveX controls are not supported.

Вот таких вот мелочей — куча.
Кстати, ваш AscGrid случайно не Windowless? если да то он не будет корректно работать на нет формах, табох и контролах
Re[4]: .Net – классы, компоненты и контролы
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.12.03 13:30
Оценка:
Здравствуйте, Grizzli, Вы писали:

G>Здравствуйте.

G>Ну например проблема использования ActiveX компонентов на WinForms.
G>вот если кинуть MsFlexGrid На Net User контрол, а потом этот User контрол вставить в 3ий контрол MyContols, или вставить на несколько закладок Tab'а то при вызове Dispose формы с табом или контрола MyContols вылетают сообщения типа Windowless ActiveX controls are not supported.

Честно говоря мне кажется, что ActiveX это плохой выбор для винйормс. Уже есть куча родных контролов.

G>Вот таких вот мелочей — куча.

G>Кстати, ваш AscGrid случайно не Windowless? если да то он не будет корректно работать на нет формах, табох и контролах

Нет он не видовлес и более менее сносно работает на винформс. Но честно говоря... см. выше.
... << RSDN@Home 1.1.2 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: .Net – классы, компоненты и контролы
От: Ракот  
Дата: 08.07.05 13:49
Оценка:
Здравствуйте, Владислав Чистяков, Вы писали:

А продолжение будет? В .NET 2.0 появились Smart Tags (http://msdn.microsoft.com/msdnmag/issues/05/07/DesignerActions/default.aspx), можно было бы что-нибудь написать про них
Re[2]: .Net – классы, компоненты и контролы
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.07.05 18:25
Оценка:
Здравствуйте, Ракот, Вы писали:

Р>Здравствуйте, Владислав Чистяков, Вы писали:


Р>А продолжение будет? В .NET 2.0 появились Smart Tags (http://msdn.microsoft.com/msdnmag/issues/05/07/DesignerActions/default.aspx), можно было бы что-нибудь написать про них


Дык написал бы.

Если серьезно, то со временем сейчас плохо. Может быть ближе к выходу студии...
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: .Net – классы, компоненты и контролы
От: Jenyay http://jenyay.net
Дата: 11.07.05 09:35
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Если серьезно, то со временем сейчас плохо. Может быть ближе к выходу студии...


А там не слышно когда это будет? И будет ли еще 3-я бета?
... << RSDN@Home 1.1.4 beta 7 rev. 0>>
Софт, исходники и фото
Re[4]: .Net – классы, компоненты и контролы
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.07.05 21:02
Оценка:
Здравствуйте, Jenyay, Вы писали:

J>А там не слышно когда это будет? И будет ли еще 3-я бета?


Приходи на следующую .Net UG и сможешь задать этот вопрос лично. Я чесно говря как-то не задавался этим вопросом. До нового года выйдет и ладно. Оно уже сейчас вполне приемлемо. Мне ведь релизов не выпускать.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: .Net – классы, компоненты и контролы
От: Аноним  
Дата: 07.03.07 10:23
Оценка:
Здравствуйте, Владислав Чистяков, Вы писали:

ВЧ>Статья:

ВЧ>.Net – классы, компоненты и контролы
Автор(ы): Владислав Чистяков
Дата: 09.05.2003
Создание ПО из компонентов подразумевает, что компоненты будут добавляться к проекту во время разработки. При этом будет производиться их начальная настройка. Компоненты как таковые не подразумевают (вернее сказать, не обязаны иметь) пользовательского интерфейса (ни для программиста, ни для конечного пользователя). В этом качестве выступают части IDE и дополнительные программные дизайнеры. Первой компонентной средой был продукт, купленный Microsoft на заре своего существования. Впоследствии на его базе родился VB. Далее была Delphi… в общем, к концу двадцатого века компоненты стали поддерживаться почти везде (даже в Visual C++, хотя он и по сей день не очень-то визуальный).


ВЧ>Авторы:

ВЧ> Владислав Чистяков

ВЧ>Аннотация:

ВЧ>Создание ПО из компонентов подразумевает, что компоненты будут добавляться к проекту во время разработки. При этом будет производиться их начальная настройка. Компоненты как таковые не подразумевают (вернее сказать, не обязаны иметь) пользовательского интерфейса (ни для программиста, ни для конечного пользователя). В этом качестве выступают части IDE и дополнительные программные дизайнеры. Первой компонентной средой был продукт, купленный Microsoft на заре своего существования. Впоследствии на его базе родился VB. Далее была Delphi… в общем, к концу двадцатого века компоненты стали поддерживаться почти везде (даже в Visual C++, хотя он и по сей день не очень-то визуальный).

"ComVisible(true)]
bool DesignMode {get;}



DesignMode – говорит, находится ли компонент в режиме разработки, то есть, загружен компонент в дизайнере типа VS.NET, или что компонент создан кодом приложения. В принципе, совершенно бесполезное свойство, так как когда компонент находится в рантайме, ему попросту не подключают site. А стало быть, проверить данное свойство совершенно невозможно."

Неверно. Проверять можно в

Protected Overrides Sub OnLayout(ByVal levent As System.Windows.Forms.LayoutEventArgs)

Отлично работает!
Re: .Net – классы, компоненты и контролы
От: Аноним  
Дата: 12.05.09 20:49
Оценка:
Интересно, жива ли тема?

После включения для контрола (UserControl) дизайнера контрол "упал" вниз. Т.е. на форме он отображается, и при запуске приложения с ним можно работать. Но выделить его на форме не могу (например, чтобы поменять положение и/или размер). Он "падает" в нижний контейнер, где обычно лежат OpenFileDialog и т.д. И тут я уже могу с ним работать (смотреть/менять свойства и тд.).

Дизайнер почти полностью взят из статьи. Он замещает реальное свойство типа Type на виртуальное типа String. Также к виртуальному свойству прикручивается рукописный Editor.

Как можно это поправить?
Re[2]: .Net – классы, компоненты и контролы
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.05.09 20:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как можно это поправить?


Скорее всего был заменен базовый класс. А вообще надо смотреть код.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: .Net – классы, компоненты и контролы
От: notacat  
Дата: 12.05.09 20:56
Оценка: +1
А>Дизайнер почти полностью взят из статьи.
Там он унаследован от ComponentDesigner, поменяйте базовый класс на ControlDesigner
Re[2]: .Net – классы, компоненты и контролы
От: Аноним  
Дата: 13.05.09 05:25
Оценка:
Отлично. Спасибо, господа.
Re[3]: .Net – классы, компоненты и контролы
От: Аноним  
Дата: 14.05.09 06:44
Оценка:
Господа, снова нужна помощь. Сделал так, как понял, но не все работает.

Как я писал выше, имеется юзер контрол.
В нем есть свойство:
public Type BindForm
        {
            get
            {
                return bFormValue;
            }
            set
            {
                try
                {
                    if (value.BaseType != typeof(Form) && value != typeof(Form))
                    {
                        throw new InvalidCastException("Должна быть форма.");
                    }
                    bFormValue = value;
                }
                catch (InvalidCastException ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }


Хочу редактировать это свойство особым образом. Смысл в том, чтобы разработчик выбирал, какую форму он хочет открыть (при нажатии кнопки на контроле).

Для этого "подменяю" реальное свойство виртуальным типа string:

        protected override void PreFilterProperties(
          System.Collections.IDictionary properties)
        {
            base.PreFilterProperties(properties);
            //const string sPropName = "Тестовое свойство";
            const string sPropName = "BindForm";
            // Добавляем виртуальное свойство, доступное только во время разработки.
            properties[sPropName] = new BindFormPropertyDescriptor(this,
              TypeDescriptor.CreateProperty(
                Component.GetType(),
                sPropName,
                typeof(String),
                new Attribute[] 
                    {
                      // Задаем категорию, в которой будет отображаться новое свойство.
                      CategoryAttribute.Data
                      // Говорим VS.NET, что при изменении этого свойства нужно 
                      // перечитать значение остальных свойств.
                      , RefreshPropertiesAttribute.All
                      //Назначим свой редактор для свойства
                      , new EditorAttribute(typeof(BindFormEditor), typeof(System.Drawing.Design.UITypeEditor))
                    }));
        }


Далее, реализую Editor для установки значения для этого виртуального свойства. Код приводить не будет, он большой.

Короче, до этого момента все работает замечательно.

Теперь хочу сделанные изменения сеарилизовать в код, чтобы он (она — Студия) записывал значение реального поля в Designer.cs

Для этого реализовал TypeConverter, чтобы строку переводить в нужный тип. Пример взят частично из MSDN, частично отсюда.

    public class FromTypeConverter : TypeConverter
    {
        // Overrides the CanConvertFrom method of TypeConverter.
        // The ITypeDescriptorContext interface provides the context for the
        // conversion. Typically, this interface is used at design time to 
        // provide information about the design-time container.
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            MessageBox.Show("FromTypeConverter.CanConvertFrom");
            if (sourceType == typeof(string))
            {
                return true;
            }
            return base.CanConvertFrom(context, sourceType);
        }
        // Overrides the ConvertFrom method of TypeConverter.
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            try
            {
                MessageBox.Show("FromTypeConverter.ConvertFrom");
                if (value is string)
                {
                    //string[] v = ((string)value).Split(new char[] { ',' });
                    //return new Point(int.Parse(v[0]), int.Parse(v[1]));
                    if (value.ToString() == "")
                    {
                        return null;
                    }
                    else
                    {
                        return Type.GetType(value.ToString());
                    }
                }
                return base.ConvertFrom(context, culture, value);
            }
            catch (System.IO.FileNotFoundException ex)
            {
                MessageBox.Show(ex.Message);
                return base.ConvertFrom(context, culture, value);
            }
        }
        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            MessageBox.Show("FromTypeConverter.CanConvertTo");
            if (destinationType == typeof(InstanceDescriptor))
                return true;
            // Всегда вызываем базовый класс если не можем 
            // совершить преобразование сами.
            return base.CanConvertTo(context, destinationType);
        }
        // Overrides the ConvertTo method of TypeConverter.
        public override object ConvertTo(ITypeDescriptorContext context,
           CultureInfo culture, object value, Type destinationType)
        {
            MessageBox.Show("FromTypeConverter.ConvertTo");
            if (destinationType == typeof(string))
            {
                //return ((Point)value).X + "," + ((Point)value).Y;
                return ((Type)value).AssemblyQualifiedName;
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }
    }


Ну и теперь включаю непосредственно сериализацию (или думаю, что включаю):

    [TypeConverter(typeof(FromTypeConverter))] //Вот тут
    [Designer(typeof(BindFormComponentDesigner)), DesignerCategory("Default")] //А это дизайнер для виртуального создания свойства
    public partial class UserControl1 : UserControl


Так вот ничего не происходит. Полученное значение не записывает в исходный код. В самом поле я его вижу, могу даже поменять и т.д. А как его в исходник загнать?

Что я делаю не так?

Спасибо.
Re[4]: .Net – классы, компоненты и контролы
От: VIPrules  
Дата: 15.05.09 08:42
Оценка:
А>Так вот ничего не происходит. Полученное значение не записывает в исходный код. В самом поле я его вижу, могу даже поменять и т.д. А как его в исходник загнать?

А>Что я делаю не так?


А>Спасибо.


Народ, разобрался.
Мож кому понадобится.

Был неправильно реализован Conveter

Вместо:

        // Overrides the ConvertTo method of TypeConverter.
        public override object ConvertTo(ITypeDescriptorContext context,
           CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(string))
            {
                //Если тип назначения  - строка, то вернем полное имя сборки
                return ((Type)value).AssemblyQualifiedName;
            }
            //Все другие типы пусть конвертирует базовый класс
            return base.ConvertTo(context, culture, value, destinationType);
        }


Нужно было просто написать:

        public override object ConvertTo(ITypeDescriptorContext context,
           CultureInfo culture, object value, Type destinationType)
        {
            //Вернем значение поля, к. редактируем
            return ((UserControl1)value).BindForm;
        }


Т.е. не нужно было передавать право преобразования в базовый класс. А просто вернуть значение свойства.

Так же полностью отказался от использования виртуальных свойств. Дизайнером для класса назначил стандартный. Вот полный заголовок:

    //Теперь первый аттрибут можно и не указывать
    //[Designer(typeof(/*BindFormComponentDesigner*/ControlDesigner)), DesignerCategory("Default")]
    [TypeConverter(typeof(FormTypeConverter))]
    [Serializable]
    public partial class UserControl1 : UserControl
    {...}


А Editor использовал для свойства напрямую:
 [Editor(typeof(BindFormEditor), typeof(System.Drawing.Design.UITypeEditor))]
        public Type BindForm
        { get; set; }


В результате пропала возможность править значение прямо в поле свойства. Но это даже и к лучшему (защита от дурака). А саму строку для извлечения типа формирую в самописной форме, к. вызывается при нажатии кнопки с троеточием.

После этих манипуляций все получилось.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.