65.9K
CodeProject 正在变化。 阅读更多。
Home

WinForms 的通用枚举编辑器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (6投票s)

2016 年 2 月 25 日

CPOL

3分钟阅读

viewsIcon

14913

downloadIcon

391

用于编辑 Flags 和非 Flags 枚举的编辑器控件

引言

Enum 枚举非常有用,并提供了一种方便的方法来定义标准列表或选项,例如 Windows Forms 中的 DayOfWeekFormBorderStyle 属性。

背景

我尽可能在我的代码中使用 Enum 枚举,并且通常使用 ComboBoxCheckedListBox 提供 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
}

这就是第一个有趣的地方... 您可以为多个元素指定相同的数值,如下所示。请注意,SaloonCarsSportsCars 的数值均为 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 属性无法正常工作
© . All rights reserved.