Acumatica处理页面过滤器DAC字段问题:如何持久化设置用于行处理
解决Acumatica过滤器字段值在Process方法中丢失的问题
你遇到的核心问题是公共实例变量在Graph回发时会被重置——每次点击Process按钮触发回发,Acumatica会重新创建Graph实例,之前赋值的变量自然就丢失了。下面是几个靠谱的解决思路,都是Acumatica开发里常用的方案:
方案1:将字段绑定到过滤器DAC(推荐)
这是最规范的做法,把决定处理方式的字段直接集成到你的过滤器DAC中,它的值会自动被Acumatica的缓存机制保留,在Process方法里直接就能获取。
步骤:
- 更新过滤器DAC,添加你需要的字段:
public class MyProcessFilter : IBqlTable { // 原有字段... [PXString(50)] [PXUIField(DisplayName = "处理模式")] public virtual string ProcessingMode { get; set; } public abstract class processingMode : PX.Data.BQL.BqlString.Field<processingMode> { } }
- 在Graph中声明过滤器视图(如果已经有了就跳过):
public PXFilter<MyProcessFilter> Filter;
- 在Process方法中直接获取值:
public virtual IEnumerable Process(PXAdapter adapter) { // 获取当前过滤器的选中记录 MyProcessFilter currentFilter = Filter.Current; if (currentFilter == null) return adapter.Get(); // 拿到你需要的字段值 string processMode = currentFilter.ProcessingMode; // 用这个值处理行数据 foreach (var row in adapter.Get()) { if (processMode == "ModeA") { // 模式A的处理逻辑 } else { // 模式B的处理逻辑 } yield return row; } return adapter.Get(); }
这种方式完全利用Acumatica原生的缓存和ViewState机制,不需要额外处理值的持久化,还符合Acumatica的开发规范。
方案2:使用PXViewState保存临时值
如果你不想修改过滤器DAC(比如只是临时需求),可以用PXViewState来存储字段值——它会把数据存在页面的ViewState里,回发时不会丢失。
步骤:
- 在过滤器的RowSelected事件中保存值:
protected virtual void MyProcessFilter_RowSelected(PXCache cache, PXRowSelectedEventArgs e) { MyProcessFilter filter = e.Row as MyProcessFilter; if (filter != null) { // 将字段值存入ViewState,指定一个唯一的键 PXViewState.SetViewState<string>("MyProcessingMode", filter.ProcessingMode); } }
- 在Process方法中读取值:
public virtual IEnumerable Process(PXAdapter adapter) { // 从ViewState中取出值,注意键要和保存时一致 string processMode = PXViewState.GetViewState<string>("MyProcessingMode"); // 后续处理逻辑和方案1一致 foreach (var row in adapter.Get()) { // 根据processMode处理行 yield return row; } return adapter.Get(); }
方案3:检查过滤器缓存的访问方式
如果你之前尝试访问过滤器缓存失败,大概率是访问方式不对。正确的方式是通过过滤器视图的Current属性获取当前选中的过滤器记录,而不是直接操作缓存的Get或其他方法:
// 错误的方式(可能获取不到当前值) var filterRecord = Filter.Cache.GetItem(...); // 正确的方式 var filterRecord = Filter.Current;
另外要注意,过滤器视图的名字要和你声明的一致,比如你声明的是PXFilter<MyProcessFilter> Filter,就必须用Filter.Current,别写错名字。
内容的提问来源于stack exchange,提问作者Jerry Welliver
相关产品推荐
相关产品推荐

