点击按钮时如何调用方法

时间:2018-12-20 22:21:28

标签: acumatica

非常不熟悉Acumatica,我试图使我在“员工时间卡”屏幕上配置的按钮可单击。我希望它在单击时调用一个方法,但未成功。

这是我的屏幕。该按钮标记为PUNCH CARD。

enter image description here

进行一些更改:

当我单击PUNCH CARD按钮时,我确实看到回发到服务器的POST:https://dev.domain.tld/db/(W(20))/pages/ep/ep305000.aspx?PopupPanel=Inline&HideScript=On&TimeCardCD=TC00000001 我想我应该在屏幕上看到一些异常响应,但是什么也没看到。

这是aspx代码。我不知道在DependOnGrid属性中放什么。我只是复制了Yuri Zaletskyy博客上的内容。是否始终将其设置为此,或者我正在使用的网站/页面是否有特定内容?如果是这样,我如何确定在这里放什么?

<px:PXToolBarButton Text="Punch Card" Visible="True" DependOnGrid="grdJiraProjects">
    <AutoCallBack Target="" Enabled="True" Command="punchCard">
      <Behavior CommitChanges="True" /></AutoCallBack>
    <PopupCommand>
      <Behavior CommitChanges="True" />
</PopupCommand></px:PXToolBarButton>

C#代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using PX.Common;
using PX.Data;
using PX.Objects.CR;
using PX.Objects.CS;
using PX.Objects.IN;
using PX.Objects.CT;
using PX.Objects.PM;
using PX.Objects.GL;
using System.Diagnostics;
using System.Globalization;
using PX.SM;
using PX.TM;
using PX.Web.UI;
using Branch = PX.Objects.GL.Branch;
using System.Text;
using PX.Objects.GL.FinPeriods.TableDefinition;
using PX.Objects.GL.FinPeriods;
using PX.Objects;
using PX.Objects.EP;

namespace TimeTracking
{
  public class TimeCardMaint_Extension : PXGraphExtension<PX.Objects.EP.TimeCardMaint>
  {   
    public PXSelect<PMTimeActivity> PMTimeActivity;
    public PXAction<EPTimeCard> PunchCard;

    #region Event Handlers
    protected void EPTimecardDetail_UsrPIXIClockIn_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e, PXFieldUpdated InvokeBaseHandler)
    {
      if(InvokeBaseHandler != null)
        InvokeBaseHandler(cache, e);
      var row = (PMTimeActivity)e.Row;
      var rows = row.GetExtension<PMTimeActivityExt>();
      updateTotalHours(cache, rows, row);
    }

    protected void EPTimecardDetail_UsrPIXIClockOut_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e, PXFieldUpdated InvokeBaseHandler)
    {      
      if(InvokeBaseHandler != null)
        InvokeBaseHandler(cache, e);
      var row = (PMTimeActivity)e.Row;
      var rows = row.GetExtension<PMTimeActivityExt>();
      updateTotalHours(cache, rows, row);
    }   
    #endregion

    public void punchCard()
    {
      throw new PXException("You Clicked Punch Time Card on Action Bar");     
    }

    public void updateTotalHours(PXCache cache, PMTimeActivityExt rows, PMTimeActivity row)
    {
       if (rows.UsrPIXIClockIn != null && rows.UsrPIXIClockOut != null)
        {
        DateTime dtClockIn = DateTime.Parse(rows.UsrPIXIClockIn.ToString());
        DateTime dtClockOut = DateTime.Parse(rows.UsrPIXIClockOut.ToString());
        double total = (dtClockOut - dtClockIn).TotalHours;
        rows.UsrPIXITotalHours = (decimal) total;
        }

    }        
  }
}

1 个答案:

答案 0 :(得分:0)

导致按钮动作事件处理程序未被调用的一个常见陷阱是为动作通用类型参数使用了错误的DAC。

确保操作通用类型与图形主DAC匹配。在您的情况下,该值为EPTimeCard

public PXAction<EPTimeCard> PunchCard;

您有图扩展名吗? 在那儿应该放置按钮的动作事件处理程序。

在您的情况下,TimeCardMaint是员工时间卡屏幕的图形:

using PX.Data;
using PX.Web.UI;
using System.Collections;

namespace PX.Objects.EP
{
    public class TimeCardMaint_Extension : PXGraphExtension<TimeCardMaint>
    {
        public PXAction<EPTimeCard> PunchCard;

        [PXButton]
        [PXUIField(DisplayName = "Punch Card")]
        public virtual IEnumerable punchCard(PXAdapter adapter)
        {
            // This is where you handle button click event
            return adapter.Get();
        }
    }
}

您添加的按钮有一些特殊之处。它位于网格工具栏中。通常,您希望网格工具栏操作在当前选定的行上进行操作。为此,您需要在ASP文件中声明操作并设置其DependOnGrid属性:

这在这里有更详细的解释: http://blog.zaletskyy.com/dependongrid-in-acumatica-or-how-to-get-currently-selected-record-in-grid

此链接也可以为您提供帮助: http://blog.zaletskyy.com/add-button-to-grid-in-acumatica

一切都设置好之后,您就可以从操作事件处理程序中访问网格中当前选定的记录,如下所示:

[PXButton]
[PXUIField(DisplayName = "Punch Card")]
public virtual IEnumerable punchCard(PXAdapter adapter)
{
    EPTimeCardDetail row = Base.Activities.Current as EPTimeCardDetail;

    if (row != null)
    {
        // Presumably do some Punch Card action on selected row from Details tab Activities grid
    }

    return adapter.Get();
}