Народ помогите...
Нужно создать свойство у класса, отображаемое в PropertyGrid, следующим образом:
напротив свойства должен стоять combobox и сожержать значения заданные при создании
объекта этого класса.
(похожее действие можно заметить у типа свойства enum, только список свойтсва должен
быть изменяемым)
Написать TypeConverter, вам необходимо обратить внимание на методы GetStandardValuesSupported, GetStandardValuesExclusive, GetStandardValues.
Простой пример для Bool есть вот тут
Здравствуйте, Warr, Вы писали:
W>Нужно создать свойство у класса, отображаемое в PropertyGrid, следующим образом: W>напротив свойства должен стоять combobox и сожержать значения заданные при создании W>объекта этого класса.
Сделать свой TypeConverter, в котором реализовать GetStandardValuesSupported() и GetStandardValues() (и другие необходимые методы). Затем надо возвратить этот конвертер для данного свойства. Для этого можно реализовать интерфейс ICustomTypeDescriptor (либо в самом классе, либо в обертке над ним) и для этого свойства возвращать свой PropertyDescriptor, в котором переопределить свойство Converter так, чтобы возвращался свой TypeConverter.
Если бы список значений был известен заранее, достаточно было бы просто прикрепить свой TypeConverter к свойству атрибутом TypeConverter. Но здесь это вряд ли подойдет...
Здравствуйте, Михаил Можаев, Вы писали:
ММ>Сделать свой TypeConverter, в котором реализовать GetStandardValuesSupported() и GetStandardValues() (и другие необходимые методы).
Правильно. ММ> Затем надо возвратить этот конвертер для данного свойства. Для этого можно реализовать интерфейс ICustomTypeDescriptor (либо в самом классе, либо в обертке над ним) и для этого свойства возвращать свой PropertyDescriptor, в котором переопределить свойство Converter так, чтобы возвращался свой TypeConverter.
Я просто атррибут над св-вом или классом прописать не получиться?
ММ>Если бы список значений был известен заранее, достаточно было бы просто прикрепить свой TypeConverter к свойству атрибутом TypeConverter. Но здесь это вряд ли подойдет...
Почему? Из конвертора я могу тебя даже исходник удалить, не то-что Instance к нужному типу привести
Может это и глупо, но у меня стоит Framework версии 1.0.5000.0
и когда пишу return new StandartValuesCollection(...),
ругается что типа или namespace'а StandartValuesCollection не существует
В чем глюк?
Здравствуйте, Warr, Вы писали:
W>Может это и глупо, но у меня стоит Framework версии 1.0.5000.0 W>и когда пишу return new StandartValuesCollection(...), W>ругается что типа или namespace'а StandartValuesCollection не существует W>В чем глюк?
Спасибо, глюк был во мне... Все работает...
Re[3]: Специфическое свойство в PropertyGrid
От:
Аноним
Дата:
08.12.04 12:04
Оценка:
"Небольшой" дополнительный вопрос: кто-нибудь знает как это заставить работать при динамической загрузке? Атрибуты Description и Category работают нормально, а TypeConverter отказывается.
Здравствуйте, Romasty, Вы писали:
R>"Небольшой" дополнительный вопрос: кто-нибудь знает как это заставить работать при динамической загрузке? Атрибуты Description и Category работают нормально, а TypeConverter отказывается.
Можно немного поподробнее?
... << RSDN@Home 1.1.3 stable >>
Re[4]: Специфическое свойство в PropertyGrid
От:
Аноним
Дата:
08.12.04 13:23
Оценка:
Есть компонент в отдельной dll. В нем есть объект свойства которого отображаються в PropertyGrid. Одно из этих свойств:
[Category("Text"),
TypeConverter(typeof(MyStringConverter)),
Description("Text")]
public string Thing
{
get{...}
set{...}
}
Если компонент в ставлен в приложение статически, то все замечательно: в PropertyGrid в нужном месте ComboBox.
Загружаем через Reflection:
Assembly a = Assembly.LoadFrom(fileName);
Type[] types=a.GetTypes();
foreach(Type t in types)
{
if(t.IsSubclassOf(typeof(...)))
{
s=(common.MyClass)(Activator.CreateInstance(t));
}
}
ComboBoxа нету.
Похожее http://www.dotnet247.com/247reference/msgs/31/155591.aspx , но как-то все громоздко.
Здравствуйте, Romasty, Вы писали:
R>Если компонент в ставлен в приложение статически, то все замечательно: в PropertyGrid в нужном месте ComboBox. R>Загружаем через Reflection:
R> Assembly a = Assembly.LoadFrom(fileName); R> Type[] types=a.GetTypes(); R> foreach(Type t in types) R> { R> if(t.IsSubclassOf(typeof(...))) R> { R> s=(common.MyClass)(Activator.CreateInstance(t)); R> } R> } R>ComboBoxа нету.
Дело в том, что тип объекта ты грузишь из явно указанной assembly. А активатор при создании объекта видя TypeConverterAttribute, указывающий на твой конвертер, не знает, где его найти и подменяет подходящим дефолтным.
Положи сборку, в которой конвертер в ту же папку, что и основное приложение и все должно заработать.
Я тут поэкспериментировал со своим конвертером и все получилось.
private void Form1_Load(object sender, System.EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
if (dlg.ShowDialog() != DialogResult.OK)
return;
Assembly a = Assembly.LoadFrom(dlg.FileName);
Type[] types=a.GetTypes();
foreach(Type t in types)
{
if (t.Name == "SampleObject")
{
object obj = Activator.CreateInstance(t);
PropertyDescriptor prop = TypeDescriptor.GetProperties(obj)["Key"];
TypeConverter converter = prop.Converter;
String converter1_name = converter.GetType().ToString();
foreach(Attribute attr in prop.Attributes)
{
Type attr_type = attr.GetType();
if (attr_type == typeof(TypeConverterAttribute))
{
TypeConverterAttribute conv_attr = (TypeConverterAttribute)attr;
String converter2_name = conv_attr.ConverterTypeName;
}
}
propertyGrid1.SelectedObject = obj;
}
}
}
Если сборка подхватывается, то converter1_name == converter2_name, иначе — не совпадают...
... << RSDN@Home 1.1.3 stable >>
Re[5]: Специфическое свойство в PropertyGrid
От:
Аноним
Дата:
09.12.04 07:51
Оценка:
Так оно и есть. Т.е. если сборка не в той же папке что и приложение, то конвертор из этой сборки принципиально никак не подцепить? Жаль. Видимо придется конверторы засовывать в отдельный файл и в папку приложения.
Здравствуйте, Romasty, Вы писали:
R>Так оно и есть. Т.е. если сборка не в той же папке что и приложение, то конвертор из этой сборки принципиально никак не подцепить?
Почему нет? Просто LoadFrom налагает на тебя обязательства по самостоятельному поиску сборок. Так что подписывайся на AppDomain.AssemblyResolve и вперед
Здравствуйте, AndrewVK, Вы писали:
AVK>Почему нет? Просто LoadFrom налагает на тебя обязательства по самостоятельному поиску сборок. Так что подписывайся на AppDomain.AssemblyResolve и вперед
Так и знал, что есть что-то такое, просто лень было в МСДН заглянуть