Re[3]: Нужен совет как быть с PropertyGrid
От: andreich78 Россия  
Дата: 25.08.05 14:23
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, andreich78, Вы писали:


А>Идея простая, но как-то это все через форточку с сигнализацией, хочется как-то дверями пользоваться. А то вдруг добрые разработчики поменяют название private свойства к которому я через Reflection лажу, и карачун.

короче, мне пришлось всё это реализовать на стандартном гриде. описанным выше способом. других путей я не нашел. если нужна помощь — помогу советом, если нужны исходники — не смогу помочь.
Re[4]: Нужен совет как быть с PropertyGrid
От: Аноним  
Дата: 25.08.05 14:36
Оценка:
Здравствуйте, andreich78, Вы писали:

Совет то, что нужно.

Например,
A>ну, например показать махонькую картинку после названия свойства, отслеживать клики на ней... ой. это можно
Нарисовать-то можно, а как клики отслеживать тоже через вытащенный через Reflection MouseClick? Или есть более легальный способ? Имелось ввиду клики отслеживать тоже через Reflection?
Re[5]: Нужен совет как быть с PropertyGrid
От: andreich78 Россия  
Дата: 25.08.05 14:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, andreich78, Вы писали:


А>Совет то, что нужно.


А>Например,

A>>ну, например показать махонькую картинку после названия свойства, отслеживать клики на ней... ой. это можно
А>Нарисовать-то можно, а как клики отслеживать тоже через вытащенный через Reflection MouseClick? Или есть более легальный способ? Имелось ввиду клики отслеживать тоже через Reflection?

это я написал про интерфейс IPropertyValueUIService
вешает децельные картинки в столбце названий и бросает наружу сообщения о двойных щелчках по картинкам.
еще заявлена возможность изменять тултип свойства в гриде, но, похоже не реализован.
интерфейс поддерживается в design-time, нов рантайме потребуется собственная реализация ISite на родительской форме. или через рефлекшн присвоить пару свойств.
кстати способ с отслеживанием кликов через рефлекшн — самый надежный.
Re[6]: Нужен совет как быть с PropertyGrid
От: Proletarius  
Дата: 25.08.05 15:29
Оценка:
Здравствуйте, andreich78, Вы писали:

A>это я написал про интерфейс IPropertyValueUIService

A>вешает децельные картинки в столбце названий и бросает наружу сообщения о двойных щелчках по картинкам.
A>еще заявлена возможность изменять тултип свойства в гриде, но, похоже не реализован.
A>интерфейс поддерживается в design-time, нов рантайме потребуется собственная реализация ISite на родительской форме. или через рефлекшн присвоить пару свойств.
A>кстати способ с отслеживанием кликов через рефлекшн — самый надежный.

Это я. Завел себе логин.
А я думал, что про GetPaintValueSupported и PaintValue у UITypeEditor.
Кстати, Dog написал, что UITypeEditor и TypeConverter помогут с вопросом ввода по маске.
Я что-то не вижу каким образом.

Про реализацию ISite, можно подробнее, не укладывается в голове как через реализацию свойств:
Component,
Container,
DesignMode,
Name,
можно потом через GetService запросить IPropertyValueUIService, у кого? В примере, что-то неясно, класс со свойствами описывает еще свойство типа ISite, а в нем у себя запрашивает этот интерфейс:
        public override System.ComponentModel.ISite Site
        {
            get
            {
                return base.Site;
            }
            set
            {                
                if( value != null )
                {
                    base.Site = value;
                    IPropertyValueUIService uiService = (IPropertyValueUIService)this.GetService(typeof(IPropertyValueUIService));
                    if( uiService != null )                    
                        uiService.AddPropertyValueUIHandler( new PropertyValueUIHandler(this.marginPropertyValueUIHandler) );                                        
                }
                else
                {
                    IPropertyValueUIService uiService = (IPropertyValueUIService)this.GetService(typeof(IPropertyValueUIService));
                    if( uiService != null )                    
                        uiService.RemovePropertyValueUIHandler( new PropertyValueUIHandler(this.marginPropertyValueUIHandler) );                                        
                    base.Site = value;
                }
            }
        }
Re[6]: Нужен совет как быть с PropertyGrid
От: Proletarius  
Дата: 26.08.05 07:53
Оценка:
Здравствуйте, andreich78, Вы писали:

A>это я написал про интерфейс IPropertyValueUIService

A>вешает децельные картинки в столбце названий и бросает наружу сообщения о двойных щелчках по картинкам.
A>еще заявлена возможность изменять тултип свойства в гриде, но, похоже не реализован.
A>интерфейс поддерживается в design-time, нов рантайме потребуется собственная реализация ISite на родительской форме. или через рефлекшн присвоить пару свойств.
A>кстати способ с отслеживанием кликов через рефлекшн — самый надежный.

Или имелось ввиду перекрыть свойство Site у родительской формы?
Тогда, наверное, в моем случае, свойстово типа ISite надо добавить у класса-реализации ICustomTypeDescriptor, так как свойства — динамические.
Re[7]: Нужен совет как быть с PropertyGrid
От: andreich78 Россия  
Дата: 26.08.05 07:56
Оценка:
P>Это я. Завел себе логин.
P>А я думал, что про GetPaintValueSupported и PaintValue у UITypeEditor.
они работают со столбцом значений. клики на картинках отдельно не обрабатывают.

P>Кстати, Dog написал, что UITypeEditor и TypeConverter помогут с вопросом ввода по маске.

P>Я что-то не вижу каким образом.

P>Про реализацию ISite, можно подробнее, не укладывается в голове как через реализацию свойств:

P>Component,
P>Container,
P>DesignMode,
P>Name,
P>можно потом через GetService запросить IPropertyValueUIService, у кого? В примере, что-то неясно, класс со свойствами описывает еще свойство типа ISite, а в нем у себя запрашивает этот интерфейс:

правильно что не укладывается, я похоже спутал ISite с другим интерфейсом или методом, потом поищу.
Суть такая — Проперть Site пропертигриду назначает кто-то извне. При назначении этой проперти он запрашивает у этого ISite`а сервиспровайдера. почти как в примере, только сервис — IServiceProvider. Экземпляр он сохраняет и за различными интерфейсами обращается к нему. в том числе и за IPropertyValueUIService.
Таким образом, есть два пути подставить пропертигриду собственною реализацию IPropertyValueUIService:
— присвоить ему нестандартное значение Site. такое, чтобы оно вернуло твой ServiceProvider. тогда пропертигрид возьмет то что нужно самостоятельно.
— достать через Reflection внутреннее поле, в котором живет сервиспровайдер и назначить его, минуя Site.

вот что я имел в виду, когда говорил о реализации ISite на родительской форме.
совершенно конечно не так надобыло сказать, ближе будет "реализация присваивания родительской формой свойства Site пропертигриду".
Re[8]: Нужен совет как быть с PropertyGrid
От: Proletarius  
Дата: 26.08.05 13:01
Оценка:
A>Суть такая — Проперть Site пропертигриду назначает кто-то извне. При назначении этой проперти он запрашивает у этого ISite`а сервиспровайдера. почти как в примере, только сервис — IServiceProvider. Экземпляр он сохраняет и за различными интерфейсами обращается к нему. в том числе и за IPropertyValueUIService.
A>Таким образом, есть два пути подставить пропертигриду собственною реализацию IPropertyValueUIService:
A>- присвоить ему нестандартное значение Site. такое, чтобы оно вернуло твой ServiceProvider. тогда пропертигрид возьмет то что нужно самостоятельно.
A>- достать через Reflection внутреннее поле, в котором живет сервиспровайдер и назначить его, минуя Site.

В design-time все работает отлично, а в runtime, imho оно заработать не сможет, так этот кто-то, кто назначает PropertyGrid.Site и поддерживает IPropertyValueUIService, это DesignHost, а runtime его просто нет, если конечно с нуля не реализовать, или подключить Microsoft.VisualStudio.dll. По моему так.
Re[9]: Нужен совет как быть с PropertyGrid
От: andreich78 Россия  
Дата: 26.08.05 13:06
Оценка:
P>В design-time все работает отлично, а в runtime, imho оно заработать не сможет, так этот кто-то, кто назначает PropertyGrid.Site и поддерживает IPropertyValueUIService, это DesignHost, а runtime его просто нет, если конечно с нуля не реализовать, или подключить Microsoft.VisualStudio.dll. По моему так.

всё правильно, кроме вывода — реализовать designerhost не нужно, пропертигрид вызывает у него всего пару методов. достаточно перекрыть толmко GetService(Type)
Re[10]: Нужен совет как быть с PropertyGrid
От: Proletarius  
Дата: 26.08.05 13:49
Оценка:
Здравствуйте, andreich78, Вы писали:


A>всё правильно, кроме вывода — реализовать designerhost не нужно, пропертигрид вызывает у него всего пару методов. достаточно перекрыть толmко GetService(Type)


Извиняюсь, конечно, за тупость, но у чего перекрыть GetService(Type), а главное у чего запрашивать IPropertyValueUIService, если его поддерживает только DesignerHost?
Re[11]: Нужен совет как быть с PropertyGrid
От: andreich78 Россия  
Дата: 26.08.05 14:02
Оценка:
Здравствуйте, Proletarius, Вы писали:

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



A>>всё правильно, кроме вывода — реализовать designerhost не нужно, пропертигрид вызывает у него всего пару методов. достаточно перекрыть толmко GetService(Type)


P>Извиняюсь, конечно, за тупость, но у чего перекрыть GetService(Type), а главное у чего запрашивать IPropertyValueUIService, если его поддерживает только DesignerHost?


так.
делаешь класс, реализующий IDesignerHost. в этом классе единственным работающим методом делаешь GetService.
вот с таким кодом:


            public object GetService(Type service)
            {
                if (service == typeof(System.Drawing.Design.IPropertyValueUIService))
                {

                    if (propertyValueUIService == null)
                    {
                        propertyValueUIService = new DummyPropertyValueUIService(owner);
                        propertyValueUIService.AddPropertyValueUIHandler(new System.Drawing.Design.PropertyValueUIHandler(PropertyValueUIHandler));
                    }
                    return propertyValueUIService;
                }
                return owner.GetService(service);
            }


у меня в роли owner`а сам пропертигрид, так что если из недр придет запрос на что-нить экзотическое — можно спокойно подставить свою реализацию этого нечта.
а вообще-то можно вместо
return owner.GetService(service);
поставить
return null;
Re[12]: Нужен совет как быть с PropertyGrid
От: Proletarius  
Дата: 26.08.05 14:59
Оценка:
Здравствуйте, andreich78, Вы писали:

A>так.

A>делаешь класс, реализующий IDesignerHost. в этом классе единственным работающим методом делаешь GetService.
A>вот с таким кодом:

A>

A>            public object GetService(Type service)
A>            {
A>                if (service == typeof(System.Drawing.Design.IPropertyValueUIService))
A>                {

A>                    if (propertyValueUIService == null)
A>                    {
A>                        propertyValueUIService = new DummyPropertyValueUIService(owner);
A>                        propertyValueUIService.AddPropertyValueUIHandler(new System.Drawing.Design.PropertyValueUIHandler(PropertyValueUIHandler));
A>                    }
A>                    return propertyValueUIService;
A>                }
A>                return owner.GetService(service);
A>            }

A>

И этот класс через reflection подсунуть в PropertyGrid.designerHost?
Кстати, здесь еще реализуется IPropertyValueUIService (DummyPropertyValueUIService), где можно почитать, что там нужно писать, примера реализации ковыряясь через reflection не нашел, в том числе и в DesignerHost.
Re[13]: Нужен совет как быть с PropertyGrid
От: andreich78 Россия  
Дата: 26.08.05 15:05
Оценка:
P>И этот класс через reflection подсунуть в PropertyGrid.designerHost?
да, я делал так.
P>Кстати, здесь еще реализуется IPropertyValueUIService (DummyPropertyValueUIService), где можно почитать, что там нужно писать, примера реализации ковыряясь через reflection не нашел, в том числе и в DesignerHost.
это просто реализация этого интерфейса, ничего кроме заполнения пары методов и одного события. можешь рефлектором выдрать из стандартной реализации, если не получится самому запрограммировать.

пока, я щас уже спешу.

слушай, а нахрена тебе этот интерфейс сдался? я им в итоге не пользовался ни разу!
мышь и отрисовка своим фонтом через него не идут!
Re[14]: Нужен совет как быть с PropertyGrid
От: Proletarius  
Дата: 26.08.05 15:16
Оценка:
Здравствуйте, andreich78, Вы писали:


P>>И этот класс через reflection подсунуть в PropertyGrid.designerHost?

A>да, я делал так.
P>>Кстати, здесь еще реализуется IPropertyValueUIService (DummyPropertyValueUIService), где можно почитать, что там нужно писать, примера реализации ковыряясь через reflection не нашел, в том числе и в DesignerHost.
A>это просто реализация этого интерфейса, ничего кроме заполнения пары методов и одного события. можешь рефлектором выдрать из стандартной реализации, если не получится самому запрограммировать.

Нашел реализацию IPropertyValueUIService в Microsoft.VisualStudio.Designer.Service.

A>пока, я щас уже спешу.


A>слушай, а нахрена тебе этот интерфейс сдался? я им в итоге не пользовался ни разу!

A>мышь и отрисовка своим фонтом через него не идут!

Просто, это уже почти, то что нужно. Только вместо одного щелчка — двойной, и свой обработчик.
Re[14]: Нужен совет как быть с PropertyGrid
От: Proletarius  
Дата: 26.08.05 15:28
Оценка:
Здравствуйте, andreich78, Вы писали:


P>>И этот класс через reflection подсунуть в PropertyGrid.designerHost?

A>да, я делал так.
P>>Кстати, здесь еще реализуется IPropertyValueUIService (DummyPropertyValueUIService), где можно почитать, что там нужно писать, примера реализации ковыряясь через reflection не нашел, в том числе и в DesignerHost.
A>это просто реализация этого интерфейса, ничего кроме заполнения пары методов и одного события. можешь рефлектором выдрать из стандартной реализации, если не получится самому запрограммировать.

A>пока, я щас уже спешу.


A>слушай, а нахрена тебе этот интерфейс сдался? я им в итоге не пользовался ни разу!

A>мышь и отрисовка своим фонтом через него не идут!

Хорошо, что мир не без добрых людей.
Спасибо, получилось.
Только почему-то два раза рисуется — буду разбираться.
Re: Нужен совет как быть с PropertyGrid
От: Аноним  
Дата: 26.08.05 06:05
Оценка:
>нету, например свойства ReadOnly...

ReadOnly мжно указать в PropertyDescriptor конкретного поля (я так думаю!)


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.