C# 避免PropertyGrid的异常

C# 避免PropertyGrid的异常,c#,.net,winforms,windows-forms-designer,propertygrid,C#,.net,Winforms,Windows Forms Designer,Propertygrid,在我的示例中,我使用了PropertyGrid控件并获取了我的所有属性和值 当我将一个属性更改为无效值时,如整数字段的“123456789008765”,它会引发以下错误: 我需要避免此错误,如果给定值无效,我需要指定一个默认值(在本例中为13,13)。我该怎么做呢?简短回答 使用将字符串转换为属性值,并将属性值转换为字符串 将字符串转换为大小值时,Size类型转换器会引发错误消息 从字符串转换时,需要更改属性的行为。 您应该创建一个自定义类型转换器,并为属性注册它,以便在从字符串转换为属性值

在我的示例中,我使用了PropertyGrid控件并获取了我的所有属性和值

当我将一个属性更改为无效值时,如整数字段的“123456789008765”,它会引发以下错误:


我需要避免此错误,如果给定值无效,我需要指定一个默认值(在本例中为
13,13
)。我该怎么做呢?

简短回答

使用将
字符串
转换为属性值,并将属性值转换为
字符串

将字符串转换为大小值时,
Size
类型转换器会引发错误消息

从字符串转换时,需要更改属性的行为。 您应该创建一个自定义类型转换器,并为属性注册它,以便在从字符串转换为属性值时处理异常

解决方案路径

以下是您应该解决的主要问题:

  • 让用户在属性网格中键入
  • 在特性网格中显示特性的字符串表示形式
  • 让用户展开属性
  • 当字符串无法转换为属性值时,请使用默认值,而不是显示消息框
你应该知道的

使用将
字符串
转换为属性值,并将属性值转换为
字符串

若要在将字符串转换为属性时自定义属性网格的行为,应

  • 要将字符串转换为属性类型,应重写
    CanConvertFrom
    ConvertFrom
    。当您说类型可以从
    字符串转换时,您将允许用户在属性网格中键入
  • 要将属性转换为字符串,应重写
    ConvertTo
    。通过这种方式,可以提供属性值的字符串表示形式
  • 要让用户扩展属性,您应该从中派生自定义转换器
  • 要为属性注册转换器,可以使用属性
  • 要获取类型的a转换器,例如
    Size
    的默认类型转换器,可以使用
    TypeDescriptor.GetConverter(typeof(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);
    }
}
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;

简短回答

使用将
字符串
转换为属性值,并将属性值转换为
字符串

将字符串转换为大小值时,
Size
类型转换器会引发错误消息

从字符串转换时,需要更改属性的行为。 您应该创建一个自定义类型转换器,并为属性注册它,以便在从字符串转换为属性值时处理异常

解决方案路径

以下是您应该解决的主要问题:

  • 让用户在属性网格中键入
  • 在特性网格中显示特性的字符串表示形式
  • 让用户展开属性
  • 当字符串无法转换为属性值时,请使用默认值,而不是显示消息框
你应该知道的

使用将
字符串
转换为属性值,并将属性值转换为
字符串

若要在将字符串转换为属性时自定义属性网格的行为,应

  • 要将字符串转换为属性类型,应重写
    CanConvertFrom
    ConvertFrom
    。当您说类型可以从
    字符串转换时,您将允许用户在属性网格中键入
  • 要将属性转换为字符串,应重写
    ConvertTo
    。通过这种方式,可以提供属性值的字符串表示形式
  • 要让用户扩展属性,您应该从中派生自定义转换器
  • 要为属性注册转换器,可以使用属性
  • 要获取类型的a转换器,例如
    Size
    的默认类型转换器,可以使用
    TypeDescriptor.GetConverter(typeof(Size))
解决方案

错误消息由
大小的类型转换器引发。因此,我们需要更改从字符串转换时属性的行为

基于以上信息,我们为您的属性实现了一个自定义类型转换器。在实现中,我们继承自
ExpandableObjectConverter
,然后在构造函数中,我们获得
Size
的默认转换器,并在重写上述方法时使用它

主要需求在
ConvertFrom
中实现,我们尝试将字符串转换为
Size
,当出现异常时,我们使用
DefaultValue