То, каким образом 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
ссылка на оригинальное сообщение