我有一个PXNumberEdit字段,在输入时,会在自定义的SO301000页面上将产品添加到网格中。插入工作和字段 在添加产品后清空。但是,我想把重点放在那个领域。似乎并不存在 该字段的SetFocus方法。
我尝试使用SO301000.cs代码来设置焦点,方法是为onValueChanged添加一个函数 将对象保存为会话变量并在页面加载上将焦点设置为保存的对象。这导致 永远不会完成加载的页面。
我也尝试过以各种方式使用jquery,但这也没有用。有没有办法做到这一点?
答案 0 :(得分:4)
黑客
框架中没有SetFocus
方法,就像SetEnabled
/ SetDisplayName
/ SetVisibility
一样,因为大多数事件是在焦点更改时引发的,而框架确保了每次记录更新都不会丢失焦点。要手动设置,您需要等待回调完成后再设置焦点。
为此,您需要将Javascript委托添加到要在回调结束后调用的事件处理程序列表中。以下代码将重点放在客户参考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>
请注意,我在 PXFormView 和 ClientEvents-ValueChanged =&#34; CustomerID_ValueChanged&#上添加了 ClientEvents-Initialize =&#34; FormView_Load&#34; 34; 在CustomerID的 PXSegmentedMask 上。
正如您所看到的,这是 hack ...当setFocusOnCustRef
被提升时,我们刚刚刷新了记录(RowSelected),我们不知道改变了什么在此之前(哪个字段已被更改?是否取消了更改?)。传递给委托的context
仅与重新更新记录有关。要更好地了解引发的事件和顺序,请参阅更新场景事件模型:
思考和提示
Add Stock Item
/ {{打开SmartPanel的函数Add
非常相似1}} / Add & Close
。如果从按钮引发回调,您将在上下文中获得有意义的信息,并且不需要在ValueChanged上添加Javascript事件。 Cancel