2

af:table 组件的“selectionListener”属性的默认值通常如下所示: selectionListener="#{bindings.IterBinding.collectionModel.makeCurrent}"

但是如果需要一些特殊的选择处理,可以为选择事件指定自定义处理程序,通常在支持 bean 中。作为此自定义处理程序的第一步,以编程方式调用使行成为当前行的默认功能。这可能类似于以下代码片段:

public void testSelectionListener(SelectionEvent selectionEvent) {        
    JSFUtils.resolveMethodExpression("#{bindings.IterBinding.collectionModel.makeCurrent}", null, 
                                   new Class[]{SelectionEvent.class}, new Object[]{selectionEvent});        
}

这应该与标准选择处理程序完全一样,对吧?
但事实并非如此。
通过单击表格列之一中的复选框触发选择更改时,此 af:selectBooleanCheckbox 的“valueChangeListener”不会在这种情况下触发。第二次点击时触发。当使用默认的“selectionListener”时,它总是按预期触发。

任何想法自定义处理程序有什么问题?

4

2 回答 2

5

好的,已经找到了这种奇怪行为的罪魁祸首。
在编辑页面标记时,JDeveloper 将 pageDef 文件中迭代器绑定的“ChangeEventPolicy”属性值从“default (none)”更改为“ppr”。
这导致了这种奇怪的行为。
手动恢复到原始值后,一切都按预期工作。
“ppr”设置似乎有很多错误,我已经遇到过类似的问题:af:panelTabbed,有时在选项卡之间切换时会收到一条神秘的错误消息。

于 2012-01-09T13:33:04.757 回答
0

请尝试以下代码:

public void onTableSelect(SelectionEvent selectionEvent) { 

    // --- perform optional pre-processing here --- //

    RichTable _table = (RichTable ) selectionEvent.getSource(); 
    CollectionModel model = (CollectionModel ) _table.getValue(); 
    JUCtrlHierBinding _binding = (JUCtrlHierBinding) model.getWrappedData(); 
    DCIteratorBinding iteratorBinding = _binding.getDCIteratorBinding(); 
    Object _selectedRowData = _table ́.getSelectedRowData(); 
    JUCtrlHierNodeBinding node = (JUCtrlHierNodeBinding) _selectedRowData ; 
    Key rwKey = node.getRowKey();
    iteratorBinding.setCurrentRowWithKey(rwKey.toStringFormat(true));

    // --- perform optional post-processing here --- // 
}
于 2012-08-09T04:27:04.323 回答