Hi, i have a strange behaviour with the treeTable and the disclosedRowKeys. In detail i want to expand specific nodes programaticaly and this should be the initial state of the treeTable. This works fine for the first render time. Now the trouble: In the action facet i have a commandLink that should reset the nodes to the initial state. All that i can see is that the treeTable is completely collapsed after you have clicked the commandLink. If you force a refresh in the browser the initial state is displayed again. In the other hand if you expand the nodes manually and force a refresh in the browser the same state of the nodes are displayed. In other words it is no request scope problem. For better understanding i will provide some code snippets:
<!-- faces-config --> <managed-bean> <managed-bean-name>activityInstanceDetails</managed-bean-name> <managed-bean-class> local.jsf.beans.ActivityInstanceDetailsBean </managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> <!-- end faces-config --> <!-- treeTable page --> <tr:treeTable disclosedRowKeys="#{activityInstanceDetails.disclosedRowKeys}" value="#{activityInstanceDetails.dataModel}" var="row" id="activityTree" rowDisclosureListener="#{activityInstanceDetails.rowDisclosureListener}" partialTriggers=":activityTree:collapseUninterested"> <f:facet name="actions"> <tr:commandLink text="Expand only current activity path" id="collapseUninterested" action="#{activityInstanceDetails.resetDisclosedRowKeys}" partialSubmit="true" immediate="true"/> </f:facet> <f:facet name="nodeStamp"> <tr:column noWrap="true"> <f:facet name="header"> <tr:outputText value="#{bundle.name}"/> </f:facet> <tr:outputText value="#{row.runtimeObject.activity.name}" inlineStyle="font-weight:bold" /> </tr:column> </f:facet> <!-- end treeTable page --> <!-- activityInstanceDetails --> public class ActivityInstanceDetailsBean { private RowKeySet disclosedEntries; private TreeModel dataModel; public ActivityInstanceDetailsBean() { SessionContext ctx = SessionContext.findSessionContext(); disclosedEntries = (RowKeySet)ctx.lookup(DISCLOSED_ENTRIES); dataModel = (TreeModel)ctx.lookup(DATA_MODEL); } public TreeModel getDataModel() { return dataModel; } private RowKeySet getInitialDisclosedRowKeys() { RowKeySet disclosedEntries = new RowKeySetTreeImpl(); TreeModel treeModel = getDataModel(); disclosedEntries.setCollectionModel(treeModel); if (treeModel != null && treeModel.getRowCount() > 0) { setActivityInstancePath(disclosedEntries, treeModel, getActivityInstance()); } return disclosedEntries; } public RowKeySet getDisclosedRowKeys() { if (disclosedEntries == null) { disclosedEntries = getInitialDisclosedRowKeys(); SessionContext.findSessionContext().bind( DISCLOSED_ENTRIES, disclosedEntries); } return disclosedEntries; } public void setDisclosedRowKeys(RowKeySet disclosedEntries) { this.disclosedEntries = disclosedEntries; SessionContext.findSessionContext().bind(DISCLOSED_ENTRIES, disclosedEntries); } public void resetDisclosedRowKeys() { setDisclosedRowKeys(getInitialDisclosedRowKeys()); } public void rowDisclosureListener(RowDisclosureEvent event) { RowKeySet added = event.getAddedSet(); RowKeySet removed = event.getRemovedSet(); if(disclosedEntries == null) { disclosedEntries = added; } else { if(!added.isEmpty()) { disclosedEntries.addAll(added); } if(!removed.isEmpty()) { disclosedEntries.removeAll(removed); } } } } <!-- end activityInstanceDetails --> Hope that anybody can help me to solve this problem. Regars, Sven