Специфическое свойство в PropertyGrid
От: Warr  
Дата: 25.11.04 10:43
Оценка:
Народ помогите...
Нужно создать свойство у класса, отображаемое в PropertyGrid, следующим образом:
напротив свойства должен стоять combobox и сожержать значения заданные при создании
объекта этого класса.

(похожее действие можно заметить у типа свойства enum, только список свойтсва должен
быть изменяемым)

Если кто, че знает пишите. Заранее спасибо.
Re: Специфическое свойство в PropertyGrid
От: V.Petrovski Беларусь  
Дата: 25.11.04 10:57
Оценка:
Здравствуйте, Warr, Вы писали:

Написать TypeConverter, вам необходимо обратить внимание на методы GetStandardValuesSupported, GetStandardValuesExclusive, GetStandardValues.
Простой пример для Bool есть вот тут
Автор: V.Petrovski
Дата: 11.05.04
.
... << RSDN@Home 1.1.4 @@subversion >>
Re: Специфическое свойство в PropertyGrid
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 25.11.04 11:14
Оценка:
Здравствуйте, Warr, Вы писали:

W>Нужно создать свойство у класса, отображаемое в PropertyGrid, следующим образом:

W>напротив свойства должен стоять combobox и сожержать значения заданные при создании
W>объекта этого класса.

Сделать свой TypeConverter, в котором реализовать GetStandardValuesSupported() и GetStandardValues() (и другие необходимые методы). Затем надо возвратить этот конвертер для данного свойства. Для этого можно реализовать интерфейс ICustomTypeDescriptor (либо в самом классе, либо в обертке над ним) и для этого свойства возвращать свой PropertyDescriptor, в котором переопределить свойство Converter так, чтобы возвращался свой TypeConverter.

Если бы список значений был известен заранее, достаточно было бы просто прикрепить свой TypeConverter к свойству атрибутом TypeConverter. Но здесь это вряд ли подойдет...

Хороший пример с ICustomTypeDescriptor есть в статье Конфигурирование .NET-приложений
Автор(ы): Андрей Корявченко
Дата: 12.05.2003
Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru.


C уважением,
Михаил.
... << RSDN@Home 1.1.3 stable >>
Re[2]: Специфическое свойство в PropertyGrid
От: V.Petrovski Беларусь  
Дата: 25.11.04 11:29
Оценка: 12 (1)
Здравствуйте, Михаил Можаев, Вы писали:

ММ>Сделать свой TypeConverter, в котором реализовать GetStandardValuesSupported() и GetStandardValues() (и другие необходимые методы).

Правильно.
ММ> Затем надо возвратить этот конвертер для данного свойства. Для этого можно реализовать интерфейс ICustomTypeDescriptor (либо в самом классе, либо в обертке над ним) и для этого свойства возвращать свой PropertyDescriptor, в котором переопределить свойство Converter так, чтобы возвращался свой TypeConverter.
Я просто атррибут над св-вом или классом прописать не получиться?

ММ>Если бы список значений был известен заранее, достаточно было бы просто прикрепить свой TypeConverter к свойству атрибутом TypeConverter. Но здесь это вряд ли подойдет...

Почему? Из конвертора я могу тебя даже исходник удалить, не то-что Instance к нужному типу привести
... << RSDN@Home 1.1.4 @@subversion >>
Re[3]: Специфическое свойство в PropertyGrid
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 25.11.04 12:20
Оценка: 4 (1) +1
Здравствуйте, V.Petrovski, Вы писали:

VP>Я просто атррибут над св-вом или классом прописать не получиться?


Спасибо, понял идею. Получится.
Уже опробовал. Примерчик, конечно, примитивный, но важна идея...:

public class EnumConverter : TypeConverter
{
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
        return true;
    }

    public override TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
  {
    SampleObject container = context.Instance as SampleObject;
    if (container == null)
      return base.GetStandardValues(context);

    return new StandardValuesCollection(container.GetStrings());
  }
}

public class SampleObject
{
  String[] strings_ = new string[]{"AAA", "BBB", "CCC"};
  public String[] GetStrings() { return strings_; }

  String text_;

  [TypeConverter(typeof(EnumConverter2))]
  public String Text
  {
      get { return text_; }
      set { text_ = value; }
  }
}


VP>Почему? Из конвертора я могу тебя даже исходник удалить, не то-что Instance к нужному типу привести


Спасибо еще раз
... << RSDN@Home 1.1.3 stable >>
Re[4]: Специфическое свойство в PropertyGrid
От: V.Petrovski Беларусь  
Дата: 25.11.04 14:14
Оценка:
молодец
... << RSDN@Home 1.1.4 @@subversion >>
Re[4]: Специфическое свойство в PropertyGrid
От: Warr  
Дата: 25.11.04 14:21
Оценка:
Может это и глупо, но у меня стоит Framework версии 1.0.5000.0
и когда пишу return new StandartValuesCollection(...),
ругается что типа или namespace'а StandartValuesCollection не существует
В чем глюк?
Re[5]: Специфическое свойство в PropertyGrid
От: Warr  
Дата: 25.11.04 14:28
Оценка:
Здравствуйте, 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 отказывается.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[4]: Специфическое свойство в PropertyGrid
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 08.12.04 12:56
Оценка:
Здравствуйте, 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 , но как-то все громоздко.



данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[5]: Специфическое свойство в PropertyGrid
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 08.12.04 14:18
Оценка:
Здравствуйте, 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
Оценка:
Так оно и есть. Т.е. если сборка не в той же папке что и приложение, то конвертор из этой сборки принципиально никак не подцепить? Жаль. Видимо придется конверторы засовывать в отдельный файл и в папку приложения.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[6]: Специфическое свойство в PropertyGrid
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.12.04 10:17
Оценка: 7 (1)
Здравствуйте, Romasty, Вы писали:

R>Так оно и есть. Т.е. если сборка не в той же папке что и приложение, то конвертор из этой сборки принципиально никак не подцепить?


Почему нет? Просто LoadFrom налагает на тебя обязательства по самостоятельному поиску сборок. Так что подписывайся на AppDomain.AssemblyResolve и вперед
... << RSDN@Home 1.1.4 beta 3 rev. 254>>
AVK Blog
Re[7]: Специфическое свойство в PropertyGrid
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 10.12.04 10:28
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Почему нет? Просто LoadFrom налагает на тебя обязательства по самостоятельному поиску сборок. Так что подписывайся на AppDomain.AssemblyResolve и вперед


Так и знал, что есть что-то такое, просто лень было в МСДН заглянуть
... << RSDN@Home 1.1.3 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.