我有一个带有要覆盖的数据视图委托的PXGraph,因此可以向网格上显示的数据添加一些自定义过滤器。
我知道如何重写和完全替换基本委托,但是我不知道如何首先执行数据视图的基本逻辑,然后将过滤器添加到结果中。
所以我要实现的结果是:
[PXOverride]
public virtual IEnumerable details()
{
var records = Base.details();
return records.Where(...);
}
我尝试仅复制整个原始dataview委托,但是它调用了基础图的许多private成员,因此我也必须复制所有这些成员,这会导致代码中出现很多难看的重复。 / p>
编辑:我的问题主要是我不能调用Base.details(),因为详细信息数据视图委托被声明为受保护的。
答案 0 :(得分:0)
看看T200。它有一个例子。对于您的情况,在数据视图委托中,您应该定义一个新的BQL语句,该语句与主视图的查询匹配。也许您不应该包含任何where语句,因为您将进一步添加它们。
PXSelectBase<YourDAC> query = new <PXSelectReadyOnly<YourDAC,Where<...>.select(yourParams)
在您的委托中,您还可以使用WhereAnd ...添加其他where子句,因此,在您的情况下,您可以向查询对象添加过滤器,例如
query.WhereAnd<Where<SomeDAC>
最后确保您的委托返回了迭代器。因此,您可以致电
return query.Select()
该查询将使用您添加的自定义过滤器执行。 希望这会有所帮助
答案 1 :(得分:0)
您在正确的轨道上。剩下的唯一事情就是将IEnumerable集合转换为List。您需要这样做,因为Linq Where方法无法在IEnumerable集合上运行。
下面是一个示例,该示例调用“客户付款方法”屏幕的基本详细信息委托并使用Linq过滤结果:
using PX.Data;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace PX.Objects.AR
{
public class CustomerPaymentMethodMaint_Extension : PXGraphExtension<CustomerPaymentMethodMaint>
{
public virtual IEnumerable details()
{
List<CustomerPaymentMethodDetail> records = Base.details().RowCast<CustomerPaymentMethodDetail>().ToList();
return records.Where(record => record.Value == "Bob");
}
}
}