有没有一种方法可以在代码中模拟网格的同步?

时间:2019-03-28 14:11:09

标签: acumatica

我需要对网格的当前选定行执行操作。我可以通过将屏幕导入“定制项目”来完成此操作,但这是屏幕所需的唯一更改。希望除非绝对必要,否则不要改动Acumatica的大部分内容(为了使新版本更容易升级),我试图避免将屏幕拉入定制项目中只是为了在网格上实现同步。

我为INSiteMaint创建了一个图形扩展,以添加我的操作按钮。我试图创建一个INLocation对象,然后在Events.RowSelected事件处理程序中进行设置。单击我的操作按钮时,该对象似乎始终是网格的第一行。

public class INSiteMaint_Extension : PXGraphExtension<INSiteMaint>
{
    INLocation location;

    public override void Initialize()
    {
        base.Initialize();
        Base.action.AddMenuAction(myAction);
    }

    protected void _(Events.RowSelected<INLocation> e)
    {
        INLocation row = e.Row;
        if (row?.LocationID != null)
        {
            location = row;
        }
    }


    #region Print Item Label
    public PXAction<INSite> myAction;
    [PXUIField(DisplayName = "My Action Label", MapEnableRights = PXCacheRights.Select)]
    [PXButton]
    protected virtual IEnumerable MyAction(PXAdapter adapter)
    {

        INSite site = Base.site.Current;
        if (location?.LocationID != null)
        {
        ...

我还尝试创建INLocation的视图以在Events.RowSelected事件处理程序中设置Current。这不会产生任何编译错误,但是该方法无法完全加载屏幕。显然,这不是一种安全的方法。

public class INSiteMaint_Extension : PXGraphExtension<INSiteMaint>
{
    public PXSelect<INLocation> loc;

    public override void Initialize()
    {
        base.Initialize();
        Base.action.AddMenuAction(myAction);
    }

    protected void _(Events.RowSelected<INLocation> e)
    {
        INLocation row = e.Row;
        if (row?.LocationID != null)
        {
            loc.Current = loc.Search<INLocation.locationID>(row.LocationID);
        }
    }


    #region Print Item Label
    public PXAction<INSite> myAction;
    [PXUIField(DisplayName = "My Action Label", MapEnableRights = PXCacheRights.Select)]
    [PXButton]
    protected virtual IEnumerable MyAction(PXAdapter adapter)
    {

        INSite site = Base.site.Current;
        INLocation location = loc.Current;

        if (location?.LocationID != null)
        {
        ...

我怀疑我的根本问题是没有同步,就没有回调来触发我的事件。我需要将此功能添加到几个屏幕上,而这一小的更改似乎将屏幕添加到自定义项目中对于升级期间的可维护性来说是严重的过大。

1 个答案:

答案 0 :(得分:1)

我必须发起与您在另一个项目中尝试的回调非常相似的回调。首先,在要位置同步的网格上,确保设置px:PXGrid部分中设置的SyncPosition =“ true”,然后将AutoCallback设置为以要重绘的控件的ID为目标,以便它们进行更新。这是我的代码的一个片段:

<px:PXGrid ID="gridShipmentLines" runat="server" DataSourceID="ds" Width="100%" SkinID="Details" SyncPosition="true" Height="100%" Style="left: 0px; top: 0px">                
    <AutoCallBack Target="fvLineDetail" Command="Refresh" ActiveBehavior="true">
        <Behavior RepaintControls="None" RepaintControlsIDs="gridShipmentLines,fvShipmentLineDetail,fvInventoryItem" />
    </AutoCallBack>
    <Levels>
        <px:PXGridLevel DataMember="HistoryDocLines">

我做了一个快速按钮来推动它作为测试动作,以获取当前的HistoryDocLine来测试获取更新的行:

public PXAction<CYHistoryDoc> GetLine;
[PXButton(CommitChanges = true)]
[PXUIField(DisplayName = "Get Line", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)]        
protected virtual IEnumerable getLine(PXAdapter adapter)
{
    CYHistoryLine HL = HistoryDocLines.Current;            
    return adapter.Get();
}

我在函数的最后一行放置了一个断点,并且能够获取当前选择的HistoryLine。看看是否有帮助。