我的表单上有一些依赖层次结构,所以我在侦察器的服务器端实现了层次结构检查。如果更改了一个字段,则会触发检查是否还需要更改其他字段。这是通过导出/导入表单数据完成的。
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 :(得分: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键切换单元格时触发,而且在使用鼠标按钮单击时也会触发。
最好的问候!