2016-06-08 33 views
0

我的窗體上有一些依賴關係層次結構,所以我在偵察服務器端實施了層次結構檢查。如果一個字段被更改,它會觸發檢查是否需要更改其他字段。這是通過導出/導入表單數據完成的。Eclipse Scout Neon導入數據後內部行集中

MyFormData input = new MyFormData(); 
FormDataUtility.exportFormData(this, input); 
input = BEANS.get(IMYService.class).validate(input, field); 
FormDataUtility.importFormFieldData(this, input, false, null, null); 

驗證功能更改所有其他需要更改的字段。

我的問題是編輯可編輯表格中的單元格。

如果我改變單元格中的值,並且這個鏈驗證被觸發,導入表單數據後,我失去了單元格中的焦點。相反,tab會將我移動到另一個單元格,tab觸發器導入和單元格中的焦點丟失。這是一個非常糟糕的用戶體驗。

如何解決這一問題? 如何在導入後保持焦點(下一個單元格)?

馬爾科

回答

0

我不知道,這是否適用於你,但你可以嘗試以下方法:
我認爲,你做你的出口/驗證/導入邏輯在列類的execCompleteEdit(ITableRow row, IFormField editingField) 。我建議,你自己計算你的下一個可聚焦單元格,並在導入表單數據後請求它的焦點。
舉個例子,你可以這樣做那樣:

@Override 
    protected void execCompleteEdit(ITableRow row, IFormField editingField) { 
     super.execCompleteEdit(row, editingField); 
     // create form data object 
     // export form data 
     // call service and validate 
     // import form data 
     // request focus for next cell 
     focusNextAvailableCell(this, row); 
    } 


focusNextAvailableCell(this, row)如下:

private void focusNextAvailableCell(IColumn<?> col, ITableRow row) { 
    if (col == null || row == null) { 
     return; 
    } 
    IColumn<?> nextColumn = getColumnSet().getColumn(col.getColumnIndex()+1); 
    ITableRow nextRow = getTable().getRow(row.getRowIndex()); 
    if (nextColumn == null) { 
     // no next column (last column lost focus) 
     // check if next row is available 
     nextRow = getTable().getRow(row.getRowIndex()+1); 
     // maybe select first cell again? 
     if (nextRow == null) { 
      nextColumn = getColumnSet().getColumn(0); 
      nextRow = getTable().getRow(0); 
     } 
    } 

    if (nextColumn != null && nextRow != null) { 
     getTable().requestFocusInCell(nextColumn, nextRow); 
    } 
} 

你應該知道,你要以後每調用此在您的專欄的execCompleteEdit方法中形成數據導入。此外,這不僅在通過按Tab鍵切換單元格時觸發,而且在用鼠標按鈕單擊時也會觸發。

此致敬禮!

+0

由於您最近的評論,這對我來說並不好。 execCompleteEdit始終在觸發單元格時觸發。在這種情況下,我無法在表單中選擇另一個字段,因爲焦點將返回到下一個單元格。是否有可能記住當前的焦點。如果我理解super.execCompleteEdit(row,editingField);應該將焦點移至下一個單元格或另一個字段,因此導入後,此字段應該重新聚焦。 –

+0

您可以將當前聚焦的單元格保存到成員變量中。例如,您可以在表上註冊監聽器(org.eclipse.scout.rt.client.ui.basic.table.TableListener),監聽TableEvent.TYPE_REQUEST_FOCUS_IN_CELL事件並保存當前的焦點單元格。 – mlu

+0

這可能是好的,但我不知道如何設置TableEvent.TYPE_REQUEST_FOCUS_IN_CELL的偵聽器。現在在fireTableEventInternal中TYPE_ROWS_SELECTED被觸發。 –