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