Modifying Items in a Dropdown List
Introduction#
In this topic you will learn how to modify field attributes inherited from the PXStringList or PXIntList attributes. The demonstrated approach will make sure to not break functionality of the base Acumatica ERP product and require minimal maintenance, if any, while upgrading your customizations to a newer version of Acumatica.
Remarks#
In all samples above, you made changes to both the _AllowedValues
and _AllowedLabels
arrays. If your task is to modify only label (external value) of a drop-down item, consider using Translation Dictionaries. For more information on Translation Dictionaries see
Acumatica ERP Documentation
Modifying Marital Statuses
In this example you will be modifying the Marital Status drop-down list found on the Contacts form (CR302000):
To add new items to the PXStringListAttribute successor
The best way to extend drop-down items hard-coded inside an attribute inherited from the PXStringList or PXIntList attribute is by increasing size of the _AllowedValues
and _AllowedLabels
arrays in the constructor of your custom field attribute:
[PXLocalizable(Messages.Prefix)]
public static class MaritalStatusesMessages
{
public const string CommonLaw = "Living common law";
public const string Separated = "Separated (not living common law)";
public const string DivorcedNoCommonLaw = "Divorced (not living common law)";
public const string NeverMarried = "Never Married";
}
public class MaritalStatusesCst1Attribute : MaritalStatusesAttribute
{
public const string CommonLaw = "L";
public const string Separated = "P";
public const string NeverMarried = "N";
public MaritalStatusesCst1Attribute()
{
Array.Resize(ref _AllowedValues, _AllowedValues.Length + 3);
_AllowedValues[_AllowedValues.Length - 3] = CommonLaw;
_AllowedValues[_AllowedValues.Length - 2] = Separated;
_AllowedValues[_AllowedValues.Length - 1] = NeverMarried;
Array.Resize(ref _AllowedLabels, _AllowedLabels.Length + 3);
_AllowedLabels[_AllowedLabels.Length - 3] = MaritalStatusesMessages.CommonLaw;
_AllowedLabels[_AllowedLabels.Length - 2] = MaritalStatusesMessages.Separated;
_AllowedLabels[_AllowedLabels.Length - 1] = MaritalStatusesMessages.NeverMarried;
}
}
In the sample above, you increased size of the _AllowedValues
and _AllowedLabels
arrays to add 3 additional items to the Marital Status drop-down list. Internal values, stored in the _AllowedValues
array, will be assigned to DAC fields and saved in database, and external values from the _AllowedValues
array represent internal values in the UI.
To test the results, in the Contact DAC extension, decorate MaritalStatus field with the MaritalStatusesCst1Attribute
:
public class ContactExt : PXCacheExtension<Contact>
{
[PXRemoveBaseAttribute(typeof(MaritalStatusesAttribute))]
[PXMergeAttributes(Method = MergeMethod.Append)]
[MaritalStatusesCst1]
public string MaritalStatus { get; set; }
}
Now there are 7 items in the Marital Status drop-down list:
To remove items declared in the PXStringListAttribute successor
To remove specific drop-down item, that was hard-coded inside an attribute inherited from the PXStringList or PXIntList attribute, you need to decrease size of the _AllowedValues
and _AllowedLabels
arrays in the constructor of your custom field attribute:
public class MaritalStatusesCst2Attribute : MaritalStatusesCst1Attribute
{
public MaritalStatusesCst2Attribute()
{
string[] allowedValues = new string[_AllowedValues.Length - 1];
string[] allowedLabels = new string[_AllowedLabels.Length - 1];
Array.Copy(_AllowedValues, 1, allowedValues, 0, _AllowedValues.Length - 1);
Array.Copy(_AllowedLabels, 1, allowedLabels, 0, _AllowedValues.Length - 1);
_AllowedValues = allowedValues;
_AllowedLabels = allowedLabels;
}
}
In the sample above, you decreased size of the _AllowedValues
and _AllowedLabels
arrays to remove Single item from the Marital Status drop-down list.
To test the results, in the Contact DAC extension, decorate MaritalStatus field with the MaritalStatusesCst2Attribute
:
public class ContactExt : PXCacheExtension<Contact>
{
[PXRemoveBaseAttribute(typeof(MaritalStatusesAttribute))]
[PXMergeAttributes(Method = MergeMethod.Append)]
[MaritalStatusesCst2]
public string MaritalStatus { get; set; }
}
Now there are only 6 items: 3 original and 3 custom - in the Marital Status drop-down list:
To replace items declared in the PXStringListAttribute successor
To replace specific drop-down item, originally hard-coded inside an attribute inherited from the PXStringList or PXIntList attribute, you need to update appropriate value in the _AllowedValues
and _AllowedLabels
arrays in the constructor of your custom field attribute:
public class MaritalStatusesCst3Attribute : MaritalStatusesCst2Attribute
{
public const string DivorcedNoCommonLaw = "V";
public MaritalStatusesCst3Attribute()
{
_AllowedValues[Array.IndexOf(_AllowedValues, Divorced)] = DivorcedNoCommonLaw;
_AllowedLabels[Array.IndexOf(_AllowedLabels, Messages.Divorced)] = MaritalStatusesMessages.DivorcedNoCommonLaw;
}
}
In the sample above, you replaced D - Divorced item with V - Divorced (not living common law) in the _AllowedValues
and _AllowedLabels
arrays respectively. By doing so, we replace both internal and external values of a drop-down item.
To test the results, in the Contact DAC extension, decorate MaritalStatus field with the MaritalStatusesCst3Attribute
:
public class ContactExt : PXCacheExtension<Contact>
{
[PXRemoveBaseAttribute(typeof(MaritalStatusesAttribute))]
[PXMergeAttributes(Method = MergeMethod.Append)]
[MaritalStatusesCst3]
public string MaritalStatus { get; set; }
}
Now there are only 6 items: 2 original, 3 custom and 1 replaced - in the Marital Status drop-down list: