回发后如何继续关注 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
仅与重新更新记录有关。为了更好地了解引发哪些事件以及引发的顺序,请参阅更新场景事件模型:
想法和技巧
- 我不太了解您的实现,但我想指出,您的需求看起来与使用按钮
Add
/[= 打开 SmartPanel 的功能 Add Stock Item
非常相似19=]/Cancel
。如果回调是从按钮引发的,您将在上下文中获得有意义的信息,并且 不需要在 ValueChanged 上添加 Javascript 事件。
- 当你Save/Cancel。焦点将 return 到 Tab 键顺序中的第一个表单元素(如果成功)。
- 您可以直接在 PXUIFieldAttribute 中设置 Tab 顺序:
PXUIField(DisplayName = "Asset ID", Visibility = PXUIVisibility.SelectorVisible, TabOrder=1)]
我有一个 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
仅与重新更新记录有关。为了更好地了解引发哪些事件以及引发的顺序,请参阅更新场景事件模型:
想法和技巧
- 我不太了解您的实现,但我想指出,您的需求看起来与使用按钮
Add
/[= 打开 SmartPanel 的功能Add Stock Item
非常相似19=]/Cancel
。如果回调是从按钮引发的,您将在上下文中获得有意义的信息,并且 不需要在 ValueChanged 上添加 Javascript 事件。 - 当你Save/Cancel。焦点将 return 到 Tab 键顺序中的第一个表单元素(如果成功)。
- 您可以直接在 PXUIFieldAttribute 中设置 Tab 顺序:
PXUIField(DisplayName = "Asset ID", Visibility = PXUIVisibility.SelectorVisible, TabOrder=1)]