求助:修改自定义Acumatica屏幕表头关键字段后保存按钮未启用
哥们,这个问题我太有共鸣了!之前自定义Acumatica屏幕时,也碰到过修改关键字段后保存按钮死活不亮的情况,折腾了好一阵才搞明白核心原因:Acumatica默认不会把关键字段(带IsKey=true的字段)的修改自动标记为脏数据,毕竟主键通常是不允许修改的,但如果业务需求必须改,就得手动配置几个关键属性。
下面是你需要给这些字段设置的属性和额外配置:
1. 给关键字段添加PXDirty属性
这个属性是核心,它会在字段值发生变化时,强制把当前数据记录标记为“脏”(Dirty),这样框架就会识别到数据已修改,自动启用保存按钮。
如果是在DAC中直接声明字段:
public class MyHeaderDAC : IBqlTable { #region KeyField1 [PXDBString(20, IsKey = true)] [PXUIField(DisplayName = "关键字段1", Enabled = true)] [PXDirty] // 关键属性:标记字段修改时触发脏标记 public virtual string KeyField1 { get; set; } public abstract class keyField1 : PX.Data.BQL.BqlString.Field<keyField1> { } #endregion #region KeyField2 [PXDBInt(IsKey = true)] [PXUIField(DisplayName = "关键字段2", Enabled = true)] [PXDirty] public virtual int? KeyField2 { get; set; } public abstract class keyField2 : PX.Data.BQL.BqlInt.Field<keyField2> { } #endregion }
如果是通过缓存附加的方式(比如在Graph类中扩展现有DAC):
public class MyCustomGraph : PXGraph<MyCustomGraph> { [PXDBString(20, IsKey = true)] [PXUIField(DisplayName = "关键字段1", Enabled = true)] [PXDirty] protected virtual void MyHeaderDAC_KeyField1_CacheAttached(PXCache cache) { } }
2. 确保字段允许编辑(PXUIField.Enabled = true)
别小看这个,要是字段被设为只读(Enabled=false),用户根本改不了值,自然不会触发脏标记。一定要在PXUIField属性里明确设置Enabled = true,让字段处于可编辑状态。
3. 配置ASPX控件的CommitChanges="True"
在屏幕的ASPX页面中,找到对应关键字段的输入控件(比如PXTextEdit、PXNumberEdit),添加CommitChanges="True"属性。这个设置会让用户修改字段值后,立即把变化提交到服务器,而不是等到失去焦点才提交,这样脏标记能及时被触发。
示例ASPX代码:
<px:PXFormView ID="formHeader" runat="server" DataSourceID="ds" DataMember="MyHeader"> <Template> <px:PXLayoutRule runat="server" StartRow="True" /> <px:PXTextEdit ID="edKeyField1" runat="server" DataField="KeyField1" CommitChanges="True" /> <px:PXNumberEdit ID="edKeyField2" runat="server" DataField="KeyField2" CommitChanges="True" /> </Template> </px:PXFormView>
4. 检查Graph中的事件处理,避免清除脏标记
如果你的Graph中对这些关键字段写了FieldUpdated或其他事件,要确保没有在事件中调用cache.SetStatus(row, PXEntryStatus.Notchanged)这类代码,这会把记录的状态改回“未修改”,导致保存按钮依然不启用。
比如,下面这种代码要避免:
protected virtual void MyHeaderDAC_KeyField1_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e) { var row = (MyHeaderDAC)e.Row; // 错误示例:不要手动把状态设为Notchanged cache.SetStatus(row, PXEntryStatus.Notchanged); }
按照上面的步骤配置后,修改表头关键字段时,保存按钮应该就能自动启用了,亲测有效!
内容的提问来源于stack exchange,提问作者pmfith

