【发布时间】: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