2015-08-12 2 views
3

У меня есть поле PXNumberEdit, которое при вводе добавляет продукт в сетку на настраиваемой странице SO301000. Вставка работает, и поле опорожняется после добавления продукта. Однако я хотел бы обратить внимание на эту область. Кажется, что нет метод SetFocus для поля.Как сохранить фокус на поле PXNumberEdit после обратной передачи?

Я попытался использовать код SO301000.cs для установки фокуса, добавив функцию для onValueChanged , чтобы сохранить объект как переменную сеанса и на pageload, чтобы установить фокус на сохраненный объект. Это приводит к тому, что страница никогда не заканчивается.

Я также пытался использовать jquery различными способами, но это тоже не сработало. Есть ли способ сделать это?

ответ

3

The Hack

Там нет SetFocus метод в рамках как есть для SetEnabled/SetDisplayName/SetVisibility, поскольку большинство событий подняты на изменения фокусных и структура гарантирует, что фокус не теряется на каждой записи обновления. Чтобы настроить его вручную, вам нужно будет дождаться завершения обратного вызова перед установкой фокуса.

Для этого вам нужно будет добавить делегата Javascript в список обработчиков событий, которые будут вызываться после завершения обратного вызова. Следующий код будет ориентирован на Customer Nbr. каждый раз, когда идентификатор клиента изменяется (в SO301000):

, что я добавил ClientEvents-Инициализировать = "FormView_Load" на PXFormView
<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> 

Примечание и ClientEvents-ValueChanged = "CustomerID_ValueChanged" на CustomerID's PXSegmentedMask.

Как вы можете видеть, что это взломать ... Когда setFocusOnCustRef поднята мы просто обновили рекорд (RowSelected), и мы не знаем, что было изменено до этого (какое поле было изменилось? было отменено изменение?). context, который передается делегату, связан только с повторным обновлением записей. Для того, чтобы получить лучшее понимание того, что поднимаются события и в каком порядке, пожалуйста, обратитесь к обновленному сценарию модели событий:

Update Scenario Event Model

Мысли и советы

  1. Я много не знаю от вашей реализации, но я хотел бы отметить, что ваши потребности очень похожи на функцию Add Stock Item, которая открывает SmartPanel с помощью кнопок Add/Add & Close/Cancel. Если обратный вызов поднят с кнопки, у вас будет значимая информация в вашем контексте, и не потребуется добавлять Javascript-событие в ValueChanged.
  2. Когда вы сохраняете/отменяете. Фокус вернется к вашему первому элементу формы в порядке вкладок (в случае успеха).
  3. Вы можете установить Tab Order непосредственно в PXUIFieldAttribute: PXUIField(DisplayName = "Asset ID", Visibility = PXUIVisibility.SelectorVisible, TabOrder=1)]
+0

Спасибо, я пытался взломать и это, кажется, работает прекрасно для моих потребностей. Обратный вызов не поднимается с кнопки, а карманный сканер, который заполняет поле на странице SOOrderEntry и выполняет ввод ключа. Кроме того, спасибо за информацию об обновленной модели событий сценария, я только начал работать над Acumatica две недели назад. –

+0

Добро пожаловать! Как правило, вам не нужно добавлять скрипт непосредственно на страницу, и большинство из того, о чем я говорил в этом потоке, не документировано. Это действительно «особый случай». Если вы новичок в Acumatica, я бы порекомендовал вам пройти экзамены разработчика T100, T200 и T300, чтобы понять лучший способ создания новых функций в программном обеспечении. – Philippe

+0

@Marie, вы могли бы принять ответ, если он поможет решить вашу проблему. – Hybridzz

Смежные вопросы