JDeveloper 11.1.2 : Command Link in Table Column Work Around
- by Frank Nimphius
Just figured that in Oracle JDeveloper 11.1.2, clicking on a command link in a table does not mark the table row as selected as it is the behavior in previous releases of Oracle JDeveloper. For the time being, the following work around can be used to achieve the "old" behavior:
To mark the table row as selected, you need to build and queue the table selection event in the code executed by the command link action listener. To queue a selection event, you need to know about the rowKey of the row that the command link that you clicked on is located in. To get to this information, you add an f:attribute tag to the command link as shown below
<af:column sortProperty="#{bindings.DepartmentsView1.hints.DepartmentId.name}" sortable="false"
headerText="#{bindings.DepartmentsView1.hints.DepartmentId.label}" id="c1">
<af:commandLink text="#{row.DepartmentId}" id="cl1" partialSubmit="true"
actionListener="#{BrowseBean.onCommandItemSelected}">
<f:attribute name="rowKey" value="#{row.rowKey}"/>
</af:commandLink>
...
</af:column>
The f:attribute tag references #{row.rowKey} wich in ADF translates to JUCtrlHierNodeBinding.getRowKey(). This information can be used in the command link action listener to compose the RowKeySet you need to queue the selected row. For simplicitly reasons, I created a table "binding" reference to the managed bean that executes the command link action. The managed bean code that is referenced from the af:commandLink actionListener property is shown next:
public void onCommandItemSelected(ActionEvent actionEvent) {
//get access to the clicked command link
RichCommandLink comp = (RichCommandLink)actionEvent.getComponent();
//read the added f:attribute value
Key rowKey = (Key) comp.getAttributes().get("rowKey");
//get the current selected RowKeySet from the table
RowKeySet oldSelection = table.getSelectedRowKeys();
//build an empty RowKeySet for the new selection
RowKeySetImpl newSelection = new RowKeySetImpl();
//RowKeySets contain List objects with key objects in them
ArrayList list = new ArrayList();
list.add(rowKey);
newSelection.add(list);
//create the selectionEvent and queue it
SelectionEvent selectionEvent = new SelectionEvent(oldSelection, newSelection, table);
selectionEvent.queue();
//refresh the table
AdfFacesContext.getCurrentInstance().addPartialTarget(table);
}