避免 PropertyGrid 的异常
Avoid exceptions from PropertyGrid
在我的示例中,我使用了 PropertyGrid 控件并获取了我的所有属性和值。
当我将一个 属性 更改为无效值时,例如整数字段的“123456789008765”,它会抛出以下错误:
我需要避免这个错误,如果给定的值无效,我需要分配一个默认值(在本例中为 13, 13
)。我该怎么做?
简答
PropertyGrid
uses the TypeConverter
将 string
转换为您的 属性 值并将您的 属性 值转换为 string
。
Size
的类型转换器在将字符串转换为大小值时引发错误消息。
从字符串转换时,您需要更改 属性 的行为。
您应该创建一个自定义类型转换器并为您的 属性 注册它以处理从字符串转换为您的 属性 值时的异常。
解决方法
以下是您应该解决的主要问题:
- 让用户在 属性 网格中键入。
- 在 属性 网格中显示 属性 的字符串表示形式。
- 让用户展开属性。
- 当字符串无法转换为您的 属性 值时,不显示消息框,而是使用默认值。
你应该知道的
PropertyGrid
uses the TypeConverter
将 string
转换为您的 属性 值并将您的 属性 值转换为 string
。
要在将字符串转换为 属性 时自定义 属性 网格的行为,您应该 Implement a Type Converter.
- 要将字符串转换为您的 属性 类型,您应该覆盖
CanConvertFrom
和 ConvertFrom
。当您说类型可以从 string
转换时,您将允许用户输入 属性 grid.
- 要将 属性 转换为字符串,您应该覆盖
ConvertTo
。通过这种方式,您可以提供 属性 值的字符串表示形式。
- 要让用户扩展 属性,您应该从
ExpandableObjectConverter
派生您的自定义转换器。
- 要为 属性 注册转换器,您可以使用
TypeConverter
属性。
- 要获取类型的转换器,例如
Size
的默认类型转换器,您可以使用 TypeDescriptor.GetConverter(typeof(Size));
解决方案
错误消息由 Size
的类型转换器引发。因此,我们需要更改 属性 从字符串转换时的行为。
根据以上信息,我们为您的 属性 实施了自定义类型转换器。在实现中,我们继承自 ExpandableObjectConverter
,然后在构造函数中,我们获取 Size
的默认转换器,并在重写上述方法时使用它。
主要要求在 ConvertFrom
中实现,我们尝试将字符串转换为 Size
,当发生异常时,我们使用 DefaultValue
您使用属性设置,如果没有默认值,我们使用 0,0
作为值。
实施
创建转换器:
public class CustomSizeConverter : ExpandableObjectConverter
{
TypeConverter converter;
public CustomSizeConverter()
{
converter = TypeDescriptor.GetConverter(typeof(Size));
}
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return converter.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
try
{
return converter.ConvertFrom(context, culture, value);
}
catch (Exception)
{
var d= context.PropertyDescriptor.Attributes.OfType<DefaultValueAttribute>().FirstOrDefault();
if (d != null)
return d.Value;
else
return new Size(0,0);
}
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
return converter.ConvertTo(context, culture, value, destinationType);
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
return converter.CanConvertTo(context, destinationType);
}
}
这是你的 class,其中包含 Size
属性 和新转换器:
public class MyObject
{
public MyObject() { SomeSize = new Size(13, 13); }
public string SomeText { get; set; }
[TypeConverter(typeof(CustomSizeConverter))]
[DefaultValue(typeof(Size), "13,13")]
public Size SomeSize { get; set; }
}
不要忘记包含所需的用法:
using System;
using System.Linq;
using System.Drawing;
using System.ComponentModel;
在我的示例中,我使用了 PropertyGrid 控件并获取了我的所有属性和值。
当我将一个 属性 更改为无效值时,例如整数字段的“123456789008765”,它会抛出以下错误:
我需要避免这个错误,如果给定的值无效,我需要分配一个默认值(在本例中为 13, 13
)。我该怎么做?
简答
PropertyGrid
uses the TypeConverter
将 string
转换为您的 属性 值并将您的 属性 值转换为 string
。
Size
的类型转换器在将字符串转换为大小值时引发错误消息。
从字符串转换时,您需要更改 属性 的行为。 您应该创建一个自定义类型转换器并为您的 属性 注册它以处理从字符串转换为您的 属性 值时的异常。
解决方法
以下是您应该解决的主要问题:
- 让用户在 属性 网格中键入。
- 在 属性 网格中显示 属性 的字符串表示形式。
- 让用户展开属性。
- 当字符串无法转换为您的 属性 值时,不显示消息框,而是使用默认值。
你应该知道的
PropertyGrid
uses the TypeConverter
将 string
转换为您的 属性 值并将您的 属性 值转换为 string
。
要在将字符串转换为 属性 时自定义 属性 网格的行为,您应该 Implement a Type Converter.
- 要将字符串转换为您的 属性 类型,您应该覆盖
CanConvertFrom
和ConvertFrom
。当您说类型可以从string
转换时,您将允许用户输入 属性 grid. - 要将 属性 转换为字符串,您应该覆盖
ConvertTo
。通过这种方式,您可以提供 属性 值的字符串表示形式。 - 要让用户扩展 属性,您应该从
ExpandableObjectConverter
派生您的自定义转换器。 - 要为 属性 注册转换器,您可以使用
TypeConverter
属性。 - 要获取类型的转换器,例如
Size
的默认类型转换器,您可以使用TypeDescriptor.GetConverter(typeof(Size));
解决方案
错误消息由 Size
的类型转换器引发。因此,我们需要更改 属性 从字符串转换时的行为。
根据以上信息,我们为您的 属性 实施了自定义类型转换器。在实现中,我们继承自 ExpandableObjectConverter
,然后在构造函数中,我们获取 Size
的默认转换器,并在重写上述方法时使用它。
主要要求在 ConvertFrom
中实现,我们尝试将字符串转换为 Size
,当发生异常时,我们使用 DefaultValue
您使用属性设置,如果没有默认值,我们使用 0,0
作为值。
实施
创建转换器:
public class CustomSizeConverter : ExpandableObjectConverter
{
TypeConverter converter;
public CustomSizeConverter()
{
converter = TypeDescriptor.GetConverter(typeof(Size));
}
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return converter.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
try
{
return converter.ConvertFrom(context, culture, value);
}
catch (Exception)
{
var d= context.PropertyDescriptor.Attributes.OfType<DefaultValueAttribute>().FirstOrDefault();
if (d != null)
return d.Value;
else
return new Size(0,0);
}
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
return converter.ConvertTo(context, culture, value, destinationType);
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
return converter.CanConvertTo(context, destinationType);
}
}
这是你的 class,其中包含 Size
属性 和新转换器:
public class MyObject
{
public MyObject() { SomeSize = new Size(13, 13); }
public string SomeText { get; set; }
[TypeConverter(typeof(CustomSizeConverter))]
[DefaultValue(typeof(Size), "13,13")]
public Size SomeSize { get; set; }
}
不要忘记包含所需的用法:
using System;
using System.Linq;
using System.Drawing;
using System.ComponentModel;