PropertyGrid убивает наповал :(
От: Аноним  
Дата: 09.11.04 16:02
Оценка:
Ситация: В объекте есть свойство:

[DefaultValue(0)]
public int Count
{
get {return _Count;}
set
{
_Count = value;
}
}
private int _Count;

Когда значение свойства редактирую в PropertyGrid, то при вводе недопустимых символов для typeof(int) получаю от
PropertyGrid модальный диалог.

Вопрос: Как сделать так, чтобы модальный диалог с сообщением об ошибке не всплывал?



данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
PropertyGrid убивает наповал :(
От: Аноним  
Дата: 09.11.04 22:18
Оценка:
То, каким образом PropertyGrid преобразовывает строку, введённую пользователем, к типу вашего свойства, определяется специальным объектом-наследником класса TypeConverter.
Вы можете переопределить TypeConverter для вашего конкретного свойства с помощью атрибута TypeConverterAttribute. Для этого нужно создать класс-наследник TypeConverter. По умолчанию, для свойств типа Int32 используется класс Int32Converter (который является наследником TypeConverter). Поскольку нас в целом устраивает его рабора и нужно поменять всего лишь небольшую деталь, унаследуем наш класс от него.
После этого нужно перекрыть метод ConvertFrom (а если вы хотите преобразовывать ещё из каких-то типов, то и CanConvertFrom) и реализовать в нём преобразование из строк так, чтобы окошка с ошибкой не возникало.
Вот моя реализация:

 /// <summary>
 /// Конвертер для типа Int32, не выбрасывающий окошко с ошибкой
 /// </summary>
 public class MyIntConverter : Int32Converter
 {
  /// <summary>
  /// Overrides <see cref="TypeConverter.ConvertFrom"/>
  /// </summary>
  public override object ConvertFrom(
   ITypeDescriptorContext context, System.Globalization.CultureInfo culture, 
   object value )
  {
   if ( value is string )
   {
    // Если нас просят сконвертировать из строки, займёмся этим делом
    string str = value as string;
    if ( Regex.IsMatch( str, @"\d+" ) )
    {
     return int.Parse( str );
    }
    else
    {
     // Если в строке пришло не число, вернём 85
     // Ну так вот мне захотелось! :-)
     return 85;
    }
   }
   else
   {
    // Если же наше значение - не строка, то просто передадим управление
    // "стандартной" реализации
    return base.ConvertFrom( context, culture, value );
   }
  }
 }

Теперь нужно этот конвертер прицепить к нашему свойству:

[DefaultValue(0)]
[ TypeConverter( typeof( MyIntConveter ) ) ]
public int Count 
{
   get {return _Count;}
   set 
   {
     _Count = value;
   }
}
private int _Count;

Попробуйте теперь поставить ваш объект в PropertyGrid и ввести какое-нибудь недопустимое значение. На его место сразу подставится 85, без всяких окошек.


Данная информация предоставляется на условиях «КАК ЕСТЬ», без предоставления каких-либо гарантий и прав. Используя данную информацию, вы соглашаетесь с тем, что (i) Майкрософт не несет ответственности за использование вами данной информации и (ii) вы принимаете на себя весь риск, связанный с использованием данной информации.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
PropertyGrid убивает наповал :(
От: Аноним  
Дата: 10.11.04 10:43
Оценка:
А как быть если тип свойства Size, double, ... User-defined? Писать TypeConvertor для каждого случая жизни? Это нереально .



данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
PropertyGrid убивает наповал :(
От: Аноним  
Дата: 10.11.04 13:02
Оценка:
ИМХО, в этом и заключается сложность и муторность разработки элементов управления...
Используйте рефлексию + универсалный TypeConverter для упрощения...
С/у Дмитрий.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
PropertyGrid убивает наповал :(
От: Аноним  
Дата: 10.11.04 15:40
Оценка:
> ИМХО, в этом и заключается сложность и муторность разработки элементов управления...
Используйте рефлексию + универсалный TypeConverter для упрощения...


А можно конкретнее ... вы предлагаете сделать адаптер/обертку вокруг TypeConverter уже имеющийся у свойства?


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
PropertyGrid убивает наповал :(
От: Аноним  
Дата: 10.11.04 19:46
Оценка: 4 (1)
Да, идея вполне здравая. Стандартный TypeConverter для данного типа (в данном случае — Int32) можно получить с помощью метода TypeDescriptor.GetConverter. После этого ваш TypeConverter мог бы вызывать стандартный и ловить исключения, кидаемые "стандартным" converter'ом.

Однако, я нашёл другой способ.
PropertyGrid пользуется для показа сообщения об ошибке услугами сервиса IUIService. Поэтому, если вы реализуете этот интерфейс и сделаете его реализацию метода ShowMessage пустой, сообщения не будет.
Чтобы передать PropertyGrid'у ваш сервис, следует также реализовать интерфейс ISite и его метод GetService(), из которого возвращать ссылку на вашу реализацию IUIService. А ссылку на реализацию ISite следует присвоить свойству PropertyGrid.Site.

Если вам мало понятно, о чём речь выше (что вполне может быть), могу выслать пример.


Данная информация предоставляется на условиях «КАК ЕСТЬ», без предоставления каких-либо гарантий и прав. Используя данную информацию, вы соглашаетесь с тем, что (i) Майкрософт не несет ответственности за использование вами данной информации и (ii) вы принимаете на себя весь риск, связанный с использованием данной информации.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
PropertyGrid убивает наповал :(
От: Аноним  
Дата: 10.11.04 22:25
Оценка:
> Однако, я нашёл другой способ...

Другой способ, это наверное, вот этот:

class PropertyGridView
{
private void ShowInvalidMessage(string propName, object value, Exception ex)
{
...
IUIService service1 = (IUIService)this.GetService(typeof(IUIService));

if (service1 != null)
{
flag2 = DialogResult.Cancel == service1.ShowDialog(this.ErrorDialog);
}
else
{
flag2 = DialogResult.Cancel == this.ShowDialog(this.ErrorDialog);
}
...
}
}

Да-а, застрял я как раз на реализации ISite и подключении его к своему PropertyGrid'у.

> ... могу выслать пример.


Заранее огромное спасибо!!!




данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
PropertyGrid убивает наповал :(
От: Аноним  
Дата: 11.11.04 00:11
Оценка:
Выслал


Данная информация предоставляется на условиях «КАК ЕСТЬ», без предоставления каких-либо гарантий и прав. Используя данную информацию, вы соглашаетесь с тем, что (i) Майкрософт не несет ответственности за использование вами данной информации и (ii) вы принимаете на себя весь риск, связанный с использованием данной информации.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: PropertyGrid убивает наповал :(
От: ixor Россия  
Дата: 04.01.05 10:21
Оценка:
Здравствуйте, Name, Вы писали:

N>Выслал


N>
данное сообщение получено с www.gotdotnet.ru

N>ссылка на оригинальное сообщение


прощу прощения.
пара месяцев уже прошла
а опубликовать этот пример есть возможность?

P.S.: сейчас как раз над этой проблеммой работаю
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re: PropertyGrid убивает наповал :(
От: Аноним  
Дата: 04.01.05 10:49
Оценка:
Опубликовал.
Файл с кодом и минимальным объяснением лежит здесь.

Здесь также можно посмотреть некоторые другие примеры из созданных мной, если вам интересно.

Данная информация предоставляется на условиях «КАК ЕСТЬ», без предоставления каких-либо гарантий и прав. Используя данную информацию, вы соглашаетесь с тем, что (i) Майкрософт не несет ответственности за использование вами данной информации и (ii) вы принимаете на себя весь риск, связанный с использованием данной информации.


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