回发后如何继续关注 PXNumberEdit 字段?

How do I keep focus on PXNumberEdit field after postback?

我有一个 PXNumberEdit 字段,在输入时将产品添加到自定义 SO301000 页面上的网格中。插入作品和领域 添加产品后清空。不过,我想return把重点放在那个领域。好像没有 该字段的 SetFocus 方法。

我尝试使用后面的 SO301000.cs 代码来设置焦点,方法是为 onValueChanged 添加一个函数 将对象保存为会话变量,并在页面加载时将焦点设置在保存的对象上。这导致 永远不会完成加载的页面。

我也尝试过以各种方式使用 jquery,但也没有用。有办法吗?

黑客

框架中没有 SetFocus 方法,就像 SetEnabled/SetDisplayName/SetVisibility 一样,因为大多数事件都是在焦点更改时引发的,框架确保焦点不会丢失在每个记录更新上。手动设置,需要等待回调完成再设置焦点。

为此,您需要将 Javascript 委托添加到回调结束后要调用的事件处理程序列表中。以下代码将焦点设置在 Customer Reference Nbr 上。每次更改客户 ID(在 SO301000 中)时:

<script type="text/javascript">
    function FormView_Load() {
        px_callback.addHandler(setFocusOnCustRef);
        return;
    }

    var setFocus = false;
    function CustomerID_ValueChanged() {
        setFocus = true;
        return;
    }

    function setFocusOnCustRef(context, error) {
        if (setFocus === true)
        {
            setFocus = false;
            var refNbr = px_alls["edCustomerRefNbr"];
            refNbr.focus();
        }
        return;
    }
</script>
<px:PXFormView ID="form" runat="server" DataSourceID="ds" Style="z-index: 100" Width="100%" DataMember="Document" Caption="Order Summary"
    NoteIndicator="True" FilesIndicator="True" LinkIndicator="True" EmailingGraph="PX.Objects.CR.CREmailActivityMaint,PX.Objects"
    ActivityIndicator="True" ActivityField="NoteActivity" DefaultControlID="edOrderType" NotifyIndicator="True"
    TabIndex="14900" ClientEvents-Initialize="FormView_Load">

     ...

    <px:PXSegmentMask CommitChanges="True" ID="edCustomerID" runat="server" DataField="CustomerID" AllowAddNew="True"
            AllowEdit="True" DataSourceID="ds" ClientEvents-ValueChanged="CustomerID_ValueChanged"/>

     ...

</px:PXFormView>

Note that I added ClientEvents-Initialize="FormView_Load" on the PXFormView and ClientEvents-ValueChanged="CustomerID_ValueChanged" on the CustomerID's PXSegmentedMask.

如您所见,这是一个 hack...当 setFocusOnCustRef 出现时,我们刚刚刷新了记录 (RowSelected),我们不知道在此之前更改了什么(更改了哪些字段?更改是否已取消?)。传递给委托的 context 仅与重新更新记录有关。为了更好地了解引发哪些事件以及引发的顺序,请参阅更新场景事件模型:

想法和技巧

  1. 我不太了解您的实现,但我想指出,您的需求看起来与使用按钮 Add/[= 打开 SmartPanel 的功能 Add Stock Item 非常相似19=]/Cancel。如果回调是从按钮引发的,您将在上下文中获得有意义的信息,并且 不需要在 ValueChanged 上添加 Javascript 事件。
  2. 当你Save/Cancel。焦点将 return 到 Tab 键顺序中的第一个表单元素(如果成功)。
  3. 您可以直接在 PXUIFieldAttribute 中设置 Tab 顺序: PXUIField(DisplayName = "Asset ID", Visibility = PXUIVisibility.SelectorVisible, TabOrder=1)]