在字段值更改后显示smartpanel - 网格保持为空

时间:2017-02-14 17:11:16

标签: acumatica

在我的一个自定义中,我需要在用户修改其中一个控件的值之后直接显示弹出窗口(在这种情况下,是销售订单输入屏幕的SOLine中的自定义字段)。此弹出窗口显示网格中的一些其他值,用户必须在完成行之前选择这些值。

使用标准流程,SmartPanel已添加到屏幕上。

如果我从一个动作/ PXLookupButton调用它,弹出窗口显示并正确填充网格。

如果我将其移至“FieldUpdated”或“RowSelected”事件,则会显示智能面板,但网格始终为空。再一次,如果我再单击按钮,网格将保持为空,直到我取消修改并仅使用按钮重新输入。

我也尝试在这些事件中调用动作的按下方法,但同样的结果也会发生。

观察SQL分析器和调试器事件我可以看到正在执行BQL语句并返回正确的行,它只是不显示在智能面板的网格中。

是否可以处理此类请求?我假设我需要将其移动到不同的方法和/或传递一些额外的值,但没有找到正确的组合。

这适用于Acumatica 5.3 / 6.1

任何意见都会受到赞赏。

1 个答案:

答案 0 :(得分:3)

RowUpdated 处理程序允许我实现请求的行为,并在字段值更改后显示 SmartPanel

下面的示例依赖于为SOLine DAC声明的自定义未绑定触发器对话框字段。当用户选中或取消选中触发对话框标记时,系统将显示项目数量对话框,以更新所选SOLINE记录的数量

public class SOLineExt : PXCacheExtension<SOLine>
{
    #region TriggerDialog
    public abstract class triggerDialog : PX.Data.IBqlField
    {
    }
    [PXBool]
    [PXUIField(DisplayName = "Trigger Dialog")]
    public virtual bool? TriggerDialog { get; set; }
    #endregion
}

enter image description here

Aspx中非常基本的 SmartPanel 声明:

<px:PXSmartPanel runat="server" ID="CstSmartPanel2" Key="SOLineParam" Caption="Item Quantity" AutoRepaint="True"
                 CaptionVisible="True" AcceptButtonID="CstButton6" AutoReload="true" >
    <px:PXFormView runat="server" ID="CstFormView3" DataMember="SOLineParam" SkinID="Transparent" >
        <Template>
            <px:PXLayoutRule runat="server" StartColumn="True" />
            <px:PXNumberEdit runat="server" ID="CstPXNumberEdit10" DataField="OrderQty" />
        </Template>
    </px:PXFormView>
        <px:PXLayoutRule runat="server" StartRow="True" />
        <px:PXPanel runat="server" ID="CstPanel5" SkinID="Buttons">
            <px:PXButton runat="server" ID="CstButton6" DialogResult="OK" CommandName="ChangeOk" CommandSourceID="ds" />
            <px:PXButton runat="server" ID="CstButton7" DialogResult="Cancel" Text="Cancel" />
    </px:PXPanel>
</px:PXSmartPanel>

使用SOOrderEntry BLC扩展程序完成订阅 RowUpdated 处理程序,SOLine DAC向用户显示项目数量对话框:

public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
    [Serializable]
    public class SOLineParams : IBqlTable
    {
        #region OrderQty
        public abstract class orderQty : PX.Data.IBqlField
        {
        }

        [PXDBDecimal]
        [PXDefault(TypeCode.Decimal, "0.0")]
        [PXUIField(DisplayName = "Quantity")]
        public virtual decimal? OrderQty { get; set; }
        #endregion
    }

    public PXFilter<SOLineParams> SOLineParam;

    public PXAction<SOOrder> ChangeOk;
    [PXUIField(DisplayName = "OK")]
    [PXButton(CommitChanges = true)]
    protected void changeOk()
    {
        var lineParams = SOLineParam.Current;
        Base.Transactions.Cache.SetValue<SOLine.orderQty>(Base.Transactions.Current, lineParams.OrderQty);
        SOLineParam.Cache.Clear();
    }

    public void SOLine_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e)
    {
        if (!sender.ObjectsEqual<SOLineExt.triggerDialog>(e.Row, e.OldRow) && e.ExternalCall == true)
        {
            SOLineParam.AskExt();
        }
    }
}

扩展程序的另一部分是 SmartPanel 调用的ChangeOk操作,以更新文档详细信息中所选记录的数量网格。要隐藏屏幕工具栏中的ChangeOk操作,还需要将以下命令添加到PXDataSource.CallbackCommands集合中:

<px:PXDSCallbackCommand Name="ChangeOk" Visible="False" />