【问题标题】:Acumatica dynamic dropdownAcumatica 动态下拉菜单
【发布时间】:2018-09-29 02:07:09
【问题描述】:

我在 Grid 中有一个下拉列表,我想在运行时填充它。我在 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


}

这是网格中的下拉菜单

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

【问题讨论】:

  • PXStringList 添加到 DAC,然后您应该能够使用 PXStringListAttribute.SetList 从代码中覆盖它的值
  • 我试过了,但还是失败了
  • 您是否遇到任何错误或只是无法正常工作?
  • 只是不工作

标签: c# runtime dropdown acumatica


【解决方案1】:

这是我不久前做的一个示例,它显示了如何利用 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 认证中进行了说明。这是一段摘录:

【讨论】:

  • 感谢@Simon ML,它运行良好。但是,我尝试在运行时加载下拉值:我在工作站中有一个本地文件,我想在下拉列表中显示几个元素。我用 DAC 上的 PXStringList 尝试了 Samvel 的建议,但它不起作用
  • 您有一个想要从中提取数据的文件?您可以尝试在CacheAttached期间加载和解析文件,它应该可以工作。
  • 感谢@SimonML!工作正常,但我接受 Samvel 的答案
【解决方案2】:

以下是如何在选择该字段时更改 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());
        }
    }
}

此外,您应该确保当您从布局编辑器将字段添加到页面时,它被添加为“组合框”

结果你会得到以下结果:

更新 1 要更改 Grid 中的下拉菜单,您可以使用以下代码作为示例:

图形扩展

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&lt;T&gt;,这仅在将null 作为行传递时才有效,以便对所有行进行更改。

【讨论】:

  • 感谢 Samvel!我用这个例子试过它,它与表单中的下拉菜单完美配合,但是我用相同的例子尝试了网格中的下拉菜单,它对我不起作用,如果你知道为什么,请告诉我
  • 感谢@SamvelPetrosov。没有 if(e.Row!=null) 也能正常工作
  • Samvel 和 Simon 的解决方案都不适用于未将 MatrixMode 网格属性设置为 true 的网格
【解决方案3】:

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

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

<px:PXGrid MatrixMode="True"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-05
    • 2012-08-29
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多