【问题标题】:Force UITypeEditor to display a initial value for a Enum type强制 UITypeEditor 显示 Enum 类型的初始值
【发布时间】:2019-06-01 11:42:32
【问题描述】:

我有一个名为 EnumFlagsEditor 的类,它继承自 UITypeEditor,以便设计一个能够使用自定义 CheckedListBox 编辑带有 FlagsAttribute 的枚举的类型编辑器,并且还能够编辑普通枚举也在同一个自定义编辑器中。

在重写的 UITypeEditor.GetEditStyle 方法中,我验证源 Enum 是否设置了 FlagsAttribute。如果 Enum 类型具有此属性类,则返回 UITypeEditorEditStyle.DropDown 以显示我的自定义 CheckedListBox。如果没有,我返回 UITypeEditorEditStyle.Modal,然后 .NET Framework 使用默认编辑器编辑枚举,使用默认 ComboBox 显示和选择枚举值/名称。

问题是,.NET 框架类库中的默认内置编辑器用于编辑普通 Enum,我注意到它会搜索值为 0 的 Enum 名称以将其显示为默认值,如果没有找到,抛出 System.ArgumentException 并且不显示默认值。

以这个枚举为例:

public enum TestEnum {
    a = 1,
    b = 2,
    c = 4
}

这将在属性网格的编辑器中抛出 System.ArgumentException 并且不会显示默认值,因为 Enum 的默认 .NET Framework 编辑器期望 Enum 内的值为 0...

现在,使用System.DayOfWeek 枚举来查看区别:

DayOfWeek.Sunday(0) 默认被选中,所以任何异常都会被抛出。

然后,在我的EnumFlagsEditor 课程中,我想阻止这种行为。我希望编辑器在我的编辑器的属性网格中显示默认值。我不关心异常,但我想显示一个特定的初始值……更准确地说,是源 Enum 中定义的最小值。

我该怎么做?

【问题讨论】:

  • 这个问题是从一个没有正确构造的对象开始的。它具有非法价值的财产。修复该错误不应该是编辑的工作,毕竟用户没有 来编辑该属性。 [Flags] 枚举声明应该有一个 None=0 成员,因此它的默认值始终是合法的。

标签: c# vb.net winforms enums propertygrid


【解决方案1】:

这不是 UITypeEditor 问题,而是 TypeConverter 问题。您可以做的是从标准的EnumConverter 类派生,如下所示:

[TypeConverter(typeof(MyEnumConverter))]
public enum TestEnum
{
    a = 1,
    b = 2,
    c = 4
}

public class MyEnumConverter : EnumConverter
{
    public MyEnumConverter(Type type)
        : base(type)
    {
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        try
        {
            return base.ConvertTo(context, culture, value, destinationType);
        }
        catch
        {
            if (destinationType == typeof(string))
            {
                // or whatever you see fit
                return "a";
            }
            throw;
        }
    }
}

PS:您可以避免异常捕获并进行自己的转换,但它可能比一般情况下看起来更困难(取决于枚举基础类型等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-18
    • 2011-05-03
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 2019-11-27
    相关资源
    最近更新 更多