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
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.