Acumtica 中的多选下拉列表

MultiSelect Dropdown in Acumtica

我有一些问题,当我 select 在保管箱中输入一个值,或者更确切地说,勾选一个复选标记时,它会自动重置。

[Serializable]
    public class KNRWCSAttributeExt : PXCacheExtension<CSAttribute>
    {
        public static bool IsActive() => true;

        #region UsrSchemaField

        [PXDBString(512, InputMask = "", IsUnicode = true)]
        [PXUIField(DisplayName = "Multi Schema Field")]
        //[PXUIVisible(typeof(Where<PX.CS.CSAttribute.controlType, Equal<CSAttribute.AttrType.giSelector>>))]
        [PXStringList(new string[] {null}, new string[] {""}, ExclusiveValues = false)]
        public virtual string UsrSchemaField { get; set; }

        public abstract class usrSchemaField : PX.Data.BQL.BqlString.Field<usrSchemaField>
        {
        }

        #endregion
    }

我假设这是因为事件再次被触发,数组被一遍又一遍地填充。使用已在 Whosebug 上描述的常见示例,它可以工作,但我的代码不起作用

请告诉我如何将数据一次放入 DropDown,这样我就可以 select 并且不会重置值。

  public class KNRWCSAttributeMaintExt : PXGraphExtension<CSAttributeMaint>
    {
        public static bool IsActive() => true;

        protected virtual void _(Events.RowSelected<CSAttribute> e)
        {
            if (e.Row == null)
            {
                return;
            }

            var el = e.Row as CSAttribute;
                
            if (el.ControlType == CSAttribute.GISelector)
            {
                if (!string.IsNullOrEmpty(e.Row.ObjectName as string))
                {
                    Type objType = System.Web.Compilation.PXBuildManager.GetType(e.Row.ObjectName, true);
                    PXCache objCache = Base.Caches[objType];
                    var fields = objCache.Fields
                        .Where(f => objCache.GetBqlField(f) != null ||
                                    f.EndsWith("_Attributes", StringComparison.OrdinalIgnoreCase))
                        .Where(f => !objCache.GetAttributesReadonly(f).OfType<PXDBTimestampAttribute>().Any())
                        .Where(f => !string.IsNullOrEmpty((objCache.GetStateExt(null, f) as PXFieldState)?.ViewName))
                        .Where(f => f != "CreatedByID" && f != "LastModifiedByID")
                        .ToArray();

                    PXStringListAttribute.SetList<KNRWCSAttributeExt.usrSchemaField>(e.Cache, e.Row, fields, fields);
                }
            }
        }
    }

查看

<asp:Content ID="cont2" ContentPlaceHolderID="phF" runat="Server">
    <px:PXFormView ID="form" runat="server" DataSourceID="ds" Style="z-index: 100" Width="100%" DataMember="Attributes" Caption="Attribute Summary">
        <Template>
            <px:PXLayoutRule runat="server" StartColumn="True" ControlSize="M" LabelsWidth="SM" />
            <px:PXSelector ID="edAttributeID" runat="server" DataField="AttributeID" AutoRefresh="True" DataSourceID="ds">
                <GridProperties FastFilterFields="description" />
            </px:PXSelector>
            <px:PXTextEdit ID="edDescription" runat="server" AllowNull="False" DataField="Description" />
            <px:PXDropDown CommitChanges="True" ID="edControlType" runat="server" AllowNull="False" DataField="ControlType" />
            <px:PXCheckBox ID="chkIsInternal" runat="server" DataField="IsInternal" />
            <px:PXCheckBox ID="chkContainsPersonalData" runat="server" DataField="ContainsPersonalData" />
            <px:PXTextEdit ID="edEntryMask" runat="server" DataField="EntryMask" />
            <px:PXTextEdit ID="edRegExp" runat="server" DataField="RegExp" />
            <px:PXSelector ID="SchemaObject" runat="server" DataField="ObjectName" AutoRefresh="True" CommitChanges="true" />
            <px:PXDropDown ID="SchemaField" runat="server" DataField="FieldName" AutoRefresh="True"  CommitChanges="True"  />
            
            <px:PXDropDown ID="edRegExpMultiSelect" runat="server" AllowMultiSelect="true" DataField="UsrSchemaField" CommitChanges="True"/>
        </Template>
    </px:PXFormView>
</asp:Content>

字段值消失仅表示自定义字段未正确实现。当系统无法 select/persist 记录或字段时,它会在控制焦点丢失时消失。

DAC 字段类型似乎有误。通常字符串列表使用固定大小的大约 2 或 3 个字母字符串的小代码: [PXDBString(3, IsFixed = true)]

由于您是动态设置列表,因此不需要在 DAC 中定义空字符串值: [PXStringList]

您需要确保您的活动始终提供预期的代码值。这可以通过删除条件并使用 SetList 方法调用的常量来检查:

也许您错过了一些步骤,例如在数据库中创建字段 table。您可以使用未绑定的 PXString 字段而不是本示例中的 PXDBString 进行测试,以查看是否是问题所在:

感谢您的帮助,我通过将这一行中的“e.Row”替换为“null”解决了问题

之前:

PXStringListAttribute.SetList<KNRWCSAttributeExt.usrSchemaField>(e.Cache, e.Row, fields, fields);

之后:

PXStringListAttribute.SetList<KNRWCSAttributeExt.usrSchemaField>(e.Cache, null, fields, fields);