Hur man itererar över elementen i en enum från X++-kod i Dynamics AX 2012
Publicerad: 15 februari 2025 kl. 23:10:59 UTC
Senast uppdaterad: 12 januari 2026 kl. 08:42:07 UTC
Den här artikeln förklarar hur man räknar upp och loopar över elementen i en basuppräkning i Dynamics AX 2012, inklusive ett X++-kodexempel.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
Informationen i det här inlägget är baserad på Dynamics AX 2012 R3. Den kan vara giltig för andra versioner, men inte nödvändigtvis.
Jag skapade nyligen ett formulär som behövde visa ett värde för varje element i en enum. Istället för att manuellt skapa fälten (och sedan behöva underhålla formuläret om enumen någonsin ändras) bestämde jag mig för att implementera det dynamiskt så att det automatiskt skulle lägga till fälten i designen vid körning.
Jag upptäckte dock snart att det faktiskt är lite förvirrande att iterera över värdena i en enum, även om det är enkelt nog när man väl vet hur.
Du behöver självklart börja med DictEnum-klassen. Som du kommer att se har den här klassen flera metoder för att hämta information som namn och etikett från både index och värde.
Skillnaden mellan index och value är att index är ett elements nummer i enum, om enumens element numrerades sekventiellt med början från noll, medan value är elementets faktiska "värde"-egenskap. Eftersom de flesta enum har värden numrerade sekventiellt från 0, kommer index och värde för ett element ofta att vara detsamma, men absolut inte alltid.
Men hur vet man vilka värden en enum har? Det är här det blir förvirrande. DictEnum-klassen har en metod som heter values(). Man kanske förväntar sig att den här metoden returnerar en lista över enumens värden, men det skulle uppenbarligen vara för enkelt, så istället returnerar den antalet värden som enumen innehåller. Antalet värden har dock ingenting att göra med de faktiska värdena, så man måste använda detta tal som grund för att anropa de indexbaserade metoderna, inte de värdebaserade.
Om de bara hade döpt den här metoden till indexes() istället, hade det varit mindre förvirrande ;-)
Tänk också på att enum-värden (och tydligen dessa "index") börjar på 0, till skillnad från array- och containerindex i X++, som börjar på 1, så för att loopa över elementen i en enum kan du göra något liknande:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
Detta kommer att mata ut symbolen och etiketten för varje element i enum till infologgen.
Vidare läsning
Om du gillade det här inlägget kanske du också gillar dessa förslag:
- Strängformatering med makro och strFmt i Dynamics AX 2012
- Använda SysExtension Framework för att ta reda på vilken underklass som ska instansieras i Dynamics AX 2012
- Dynamics AX 2012 SysOperation Framework Snabböversikt
