如何在 Dynamics AX 2012 中从 X++ 代码迭代枚举元素
已出版: 2025年2月15日 UTC 23:11:04
本文介绍如何在 Dynamics AX 2012 中枚举和循环遍历基本枚举的元素,包括 X++ 代码示例。
为了使尽可能多的人能够访问本页面,本页面由英文机译而成。遗憾的是,机器翻译技术尚不完善,因此可能会出现错误。如果您愿意,可以在此处查看原始英文版本:
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
本文中的信息基于 Dynamics AX 2012 R3。它可能对其他版本有效,也可能无效。
我最近正在创建一个表单,需要显示枚举中每个元素的值。我决定动态实现它,以便它在运行时自动将字段添加到设计中,而不是手动创建字段(然后在枚举被修改时需要维护表单)。
然而,我很快发现,实际上迭代枚举中的值虽然一旦你知道如何做就很容易,但却有点令人困惑。
显然,您需要从 DictEnum 类开始。如您所见,该类有几种方法可以从索引和值中获取名称和标签等信息。
索引和值之间的区别在于,如果枚举的元素从零开始按顺序编号,则索引是枚举中元素的编号,而值是元素的实际“值”属性。由于大多数枚举的值都是从 0 开始按顺序编号的,因此元素的索引和值通常相同,但肯定不总是如此。
但是您如何知道枚举具有哪些值?这就是令人困惑的地方。DictEnum 类有一个名为 values() 的方法。您可能希望此方法返回枚举值的列表,但这显然太简单了,因此它返回枚举包含的值的数量。但是,值的数量与实际值无关,因此您需要使用此数字作为调用基于索引的方法的基础,而不是基于值的方法。
如果他们将这种方法命名为 indexes(),那么就不会那么令人困惑了 ;-)
还请记住,枚举值(显然这些“索引”)从 0 开始,与 X++ 中的数组和容器索引不同,后者从 1 开始,因此要循环遍历枚举中的元素,您可以执行以下操作:
DictEnum dictEnum = new DictEnum(enumNum(SalesStatus));
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
这会将枚举中每个元素的符号和标签输出到信息日志。