WinForms 的通用枚举编辑器






4.89/5 (6投票s)
用于编辑 Flags 和非 Flags 枚举的编辑器控件
引言
Enum
枚举非常有用,并提供了一种方便的方法来定义标准列表或选项,例如 Windows Forms 中的 DayOfWeek
或 FormBorderStyle
属性。
背景
我尽可能在我的代码中使用 Enum
枚举,并且通常使用 ComboBox
或 CheckedListBox
提供 GUI 编辑功能。这对于大多数简单的 Enum
类型来说没问题,但是 Enum
枚举实际上可能非常复杂,如下所述,并且编辑可能需要比基本的 CheckListBox
更多功能。
许多简单的 Enum
枚举是使用元素名称列表定义的,如这里所示。如果需要,您可以选择指定用于存储 Enum
实际值的底层数据类型,但这并非必需,并且将默认为 int
。
/// <summary>
/// The Simple Enum
/// </summary>
public enum Vehicles
{
None,
Cars,
MotorCycles,
Trucks,
Buses
}
如果您没有指定每个元素的数值,编译器将自动提供这些值,从第一个项目的 0
开始,然后为每个后续项目递增 1。但是,如果需要,您可以指定每个项目的实际数值,如下所示
/// <summary>
/// The Simple Enum
/// </summary>
public enum Vehicles : int
{
None = 0,
Cars = 1,
MotorCycles = 2,
Trucks = 3,
Buses = 4
}
这就是第一个有趣的地方... 您可以为多个元素指定相同的数值,如下所示。请注意,SaloonCars
和 SportsCars
的数值均为 1
。
/// <summary>
/// Enum with more than 1 element having the same numeric value.
/// </summary>
public enum Vehicles : int
{
None = 0,
SaloonCars = 1,
SportsCars = 1,
MotorCycles = 2,
Trucks = 3,
Buses = 4
}
Flags 枚举
对于简单的 Enum
类型,您只能从值列表中选择一个值。 Flags 类型的 Enum
枚举用 FlagsAttribute ([Flags])
装饰。对于 Flags Enum
枚举,Enum
中的每个元素代表底层值中设置的一个或多个位。与简单的 Enum
枚举一样,多个元素可以具有相同的数值。Flags Enums
中的元素也可以表示 Enum
中其他值的一个集合,如下所示
/// <summary>
/// A typical Flags Enum
/// </summary>
[Flags]
public enum Targets: int
{
Users = 1,
Computers = 2,
UserAndComputer= 3,
Servers = 4,
All = 7
}
请注意,元素 'All
' (7) 代表二进制值 111
,这实际上将匹配 Users、Computers 和 Servers。
如果您将 Enum
的值设置为与一个或多个已定义元素不匹配的值,您将不会得到一个 Exception
异常,并且当调用 ToString()
方法时,它将显示数值的 string
表现形式,而不是 Enum
名称的列表。开发人员通常必须包含代码来检测这种情况,并为无效值抛出 ArgumentOutOfRange
异常。另请注意,并非所有 Enum
枚举都有一个表示数值 0
的值,因此 Enum
的默认值甚至可能与任何已定义的 flag 名称都不匹配。
var targets = Targets.Users | Targets.Servers;
Console.WriteLine(targets); // Will display "Users, Servers"
var targets = Targets.Users | Targets.Computer;
Console.WriteLine(targets); // Will display "UsersAndComputers"
// Set the enum to an invalid (unsupported) value
var targets = (Targets)8;
Console.WriteLine(targets); // Will display "8" as 8 is not a supported value
// Set the enum to the default value
targets = (Targets)0;
Console.WriteLine(targets); // Will display "0" as 0 is not a supported value
Enum 编辑器
我开发了一个基于 CheckistBox
控件的通用 Enum
编辑器控件。它将与所有支持的底层数据类型的 Enum
枚举一起正常工作。它处理简单和 flags Enums
。如果需要,简单的 Enum
类型将呈现为 RadioButtons
而不是 CheckBoxes
。
编辑器还处理具有相同底层值的多个元素的 Enum
枚举。一个例子是 System.Security.AccessControl.FileSystemRights Enum
。这是一个复杂的 Enum
,用于指定文件系统访问权限,并且与 Window 文件系统安全对话框密切相关。
Using the Code
要使用该代码,只需解压缩演示项目并运行它即可。编辑器控件是派生自 CheckListBox
控件的 'EnumEditor
' 自定义控件。
关注点
我最初认为 Enum
枚举非常简单,但调查得越多,我意识到比我最初想象的还有很多细微差别,因此我尝试了许多版本的 Enum
编辑器,直到我最终满意为止。
历史
- 版本 1:
ItemHeight
属性无法正常工作