Acumatica 动态下拉列表

Acumatica dynamic dropdown

我在网格中有一个下拉列表,我想在运行时填充它。我在 RowSelected 事件中尝试过,但它不起作用。

然后我尝试在DAC的字段定义中赋值属性PXStringList,也没有用。

这是活动

        protected virtual void HIASetupDetail_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
    {
        List<string> values = new List<string>();
        values.AddRange(new string[] { "A", "B" });

        if (e.Row == null)
        {
            return;
        }

        HIASetupDetail HIASetupDetailRow = (HIASetupDetail)e.Row;

        PXStringListAttribute.SetList<HIASetupDetail.acumaticaField>(sender, HIASetupDetailRow, values.ToArray(), values.ToArray());
    }

这是 DAC

[System.SerializableAttribute()]
public class HIASetupDetail : PX.Data.IBqlTable
{        
    #region AcumaticaField
    public abstract class acumaticaField : PX.Data.IBqlField
    {
    }
    [PXDBString()]
    [PXDefault()]
    [PXUIField(DisplayName = "Acumatica Field")]
    public virtual string AcumaticaField { get; set; }
    #endregion


}

这是网格中的下拉菜单

知道为什么它在网格中不起作用吗?

这是我刚才做的一个例子,展示了如何利用 CacheAttached 方法动态填充字符串列表。它会根据当前公司更改可用值。

public class DynamicDropdownAttribute : PXStringListAttribute
{
    private string[] Values2 = { "A", "C" };
    private string[] Labels2 = { "Alpha", "Charlie" };

    private string[] Values3 = { "N", "C" };
    private string[] Labels3 = { "November", "Charlie" };

    public DynamicDropdownAttribute()
        : base()
    {
    }

    public override void CacheAttached(PXCache sender)
    {
        base.CacheAttached(sender);
        var company = PX.Data.Update.PXInstanceHelper.CurrentCompany;
        if (company == 2)
        {
            this._AllowedValues = Values2;
            this._AllowedLabels = Labels2;
        }
        else if (company == 3)
        {
            this._AllowedValues = Values3;
            this._AllowedLabels = Labels3;
        }
    }
}

public class SOOrderPXExt : PXCacheExtension<SOOrder>
{
    [PXString(1)]
    [PXUIField(DisplayName = "Process")]
    [DynamicDropdown]
    public virtual string UsrProcess { get; set; }
    public abstract class usrProcess : IBqlField { }
}

您需要使用 CacheAttached 的原因在 Acumatica 开放大学的 T200 认证中有解释。这是摘录:

下面是如何在选择该字段时更改 PXStringListAttribute 的值的示例:

DAC 扩展:

public class SOOrderExt:PXCacheExtension<SOOrder>
{

    #region TestField
    [PXString]
    [PXStringList()]
    [PXUIField(DisplayName = "Acumatica Field")]
    public string TestField { get; set; }

    public abstract class testField : IBqlField { }
    #endregion
}

图形扩展

public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
    public virtual void SOOrder_TestField_FieldSelecting(PXCache sender,PXFieldSelectingEventArgs e)
    {
        if(e.Row!=null)
        {
            List<string> values = new List<string>();
            values.AddRange(new []{ "First","Second"});
            SOOrder row = (SOOrder)e.Row;
            PXStringListAttribute.SetList<SOOrderExt.testField>(sender, row, values.ToArray(), values.ToArray());
        }
    }
}

此外,您还应该确保当您从布局编辑器将字段添加到页面时,它被添加为 "Combobox"

结果您将得到以下内容:

更新 1 要更改网格中的下拉列表,您可以使用以下代码作为示例:

图形扩展

public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
    public virtual void SOLine_TestField_FieldSelecting(PXCache sender,PXFieldSelectingEventArgs e)
    {
        if(e.Row!=null)
        {
            List<string> values = new List<string>();
            values.AddRange(new[] { "First", "Second" });
            PXStringListAttribute.SetList<SOLineExt.testField>(sender, null, values.ToArray(), values.ToArray());
        }
    }
}

DAC 扩展

public class SOLineExt : PXCacheExtension<SOLine>
{

    #region TestField
    [PXString]
    [PXStringList()]
    [PXUIField(DisplayName = "Acumatica Field")]
    public string TestField { get; set; }

    public abstract class testField : IBqlField { }
    #endregion
}

如您所见,不同之处在于在网格情况下调用 PXStringListAttribute.SetList<T> 这仅在将 null 作为行传递时才有效,以便对所有行进行更改。

您计算的问题来自网格控件,而不是来自 DAC/Graph。

因为您为每行设置了不同的单元格格式,所以您需要设置:

<px:PXGrid MatrixMode="True"