订单项中的弹出例外(SOLine)

时间:2018-01-24 23:40:54

标签: acumatica

如何显示弹出式异常,而不是行项目中带红点的异常?我能够在RowInserting中使用它们一点点但是在一系列代码更改之后我得到了红点1。它甚至没有像我想的那样创建一个新行但现在确实如此。 RowInserting事件:

    protected virtual void SOLine_RowInserting(PXCache sender, PXRowInsertingEventArgs e)
    {
        var listMissingOEdesc = new List<int>();
        var select = Base.Transactions.Select();

        foreach (SOLine row in select)
        {
            var isOEDesc = IsOEDescEnabled(sender, row);
            var rowExt = PXCache<SOLine>.GetExtension<SOLineExt>(row);
            if (isOEDesc == true)
                if (rowExt.UsrOedesc == null)
                    listMissingOEdesc.Add(row.SortOrder.Value);

        }

        if (listMissingOEdesc.Count > 0)
        {
            throw new PXException("Line items with sort order {0} do not have OE Desc filled out. Cannot add a new line.", string.Join(", ", listMissingOEdesc));
        }
        else
            Base.Actions.PressSave();
    }

谢谢!

1 个答案:

答案 0 :(得分:0)

如果有的话,没有简单的方法来显示弹出异常并阻止网格插入新行。框架的设计方式,PXGrid首先在网页上插入一个新行。之后,PXGrid向应用程序服务器发送回调请求新行的默认字段值(如果PXGrid的模式具有InitNewRow="True")或将从网页捕获的所有值发送到应用程序服务器,那么新的行可以插入PXCache中。每当调用字段或行级别的事件处理程序时,新行仍将对网页上的用户可见。即使您在其中一个事件处理程序中的事务数据视图上调用Ask方法,新行也不会从网页中消失。

尽管如此,显示弹出窗口异常并阻止网格插入新行的唯一方法是使用自定义操作替换PXGrid上的标准添加新行按钮,如有必要,将首先运行验证并显示弹出异常。否则,将在PXGrid中插入一个新行。它还需要根据标准PXGrid的插入按钮的状态启用或禁用自定义 NewSOTran 操作。

public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
    public void SOOrder_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
    {
        NewSOTran.SetEnabled(Base.Transactions.AllowInsert);
    }

    public PXAction<SOOrder> NewSOTran;
    [PXButton(CommitChanges = true)]
    [PXUIField]
    protected void newSOTran()
    {
        var listMissingOEdesc = new List<SOLine>();
        var select = Base.Transactions.Select();

        foreach (SOLine row in select)
        {
            var isOEDesc = !string.IsNullOrEmpty(row.TranDesc);
            if (isOEDesc == true)
                listMissingOEdesc.Add(row);
        }

        if (listMissingOEdesc.Count > 0)
        {
            throw new PXException("Cannot add a new line.");
        }

        var newTran = Base.Transactions.Insert();
        Base.Transactions.Cache.ActiveRow = newTran;
    }
}

在Aspx中,需要3个主要特征:

    PXGrid的
  1. SyncPositionWithGraph 属性设置为 True

    <px:PXGrid ID="grid" runat="server" DataSourceID="ds" Width="100%" TabIndex="100" 
       SkinID="DetailsInTab" StatusField="Availability" SyncPosition="True" Height="473px" 
       SyncPositionWithGraph="True" >
    
  2. 标准 AddNew 操作必须由自定义 NewSOTran 操作替换:

    <ActionBar>
        <Actions>
            <AddNew ToolBarVisible ="False" />
        </Actions>
        <CustomItems>
            <px:PXToolBarButton CommandName="NewSOTran" CommandSourceID="ds" 
                                DisplayStyle="Image">
                <Images Normal="main@AddNew" />
                <ActionBar GroupIndex="0" Order="2" />
            </px:PXToolBarButton>
            ...
        </CustomItems>
    </ActionBar>
    
  3. 在PXGrid的模式部分中将
  4. AllowAddNew 属性设置为false,以防止在用户使用键盘时执行标准插入按钮快捷方式或双击PXGrid:

    <Mode InitNewRow = "True" AllowFormEdit="True" AllowUpload="True" AllowDragRows="true" 
          AllowAddNew="false" />
    
  5. 要选择新记录的第一个单元格并将其切换到编辑模式(除非第一个单元格是只读的),它还需要订阅初始化 ToolsButtonClick PXGrid的客户端事件:

    <ClientEvents Initialize="initTransactionsGrid" 
                  ToolsButtonClick="transactionsGriduttonClick" />
    

    并定义以下JavaScript函数:

    var isInitEvents = false;
    function initTransactionsGrid(a, b) {
        if (isInitEvents) return;
    
        isInitEvents = true;
        a.events.addEventHandler("afterRepaint", editNewSOTran);
    }
    
    function editNewSOTran() {
        if (lastActiveRowIndex != null) {
            var grid = px_alls["grid"];
            if (grid.activeRow) {
                var activeRowIndex = grid.rows.indexOf(grid.activeRow);
                if (activeRowIndex != lastActiveRowIndex) {
                    grid.activeRow.activateCell(0, false);
                    grid.beginEdit();
                }
            }
            lastActiveRowIndex = null;
        }
    }
    
    var lastActiveRowIndex;
    function transactionsGriduttonClick(sender, args) {
        if (args.button && args.button.commandName == "NewSOTran") {
            if (sender.activeRow) 
                lastActiveRowIndex = sender.rows.indexOf(sender.activeRow);
            else
                lastActiveRowIndex = -1;
            return;
        }
        lastActiveRowIndex = null;
    }
    

    要将自定义JavaScript代码打包到自定义中,在布局编辑器中,您可以从“添加控件”选项卡中拖放 Java Script 元素,并将整个JavaScript代码复制到脚本财产。