Skip to main content

ADF Dependant select items in a table: Things I learned being stupid


Hard hard thing to do - table of dependant select items that you can add new rows to. (backing bean driven)
(When you add a new row it keeps values from the previous row)

In my search for the answer I made an forEach act like a table - by using the f:attribute to pass through the current row - crazy but I hopw this helps someone sometime.

Stuff I learned
            <af:selectOneChoice label="#{labelBundle['choice_lbl']}"
                                id="soc1" value="#{row.choiceId}"
                                valueChangeListener="#{pageFlowScope.testBean.choiceValueChange}"
                                required="true"
                                autoSubmit="true" unselectedLabel="Choose...">
              <f:attribute name="currentRow" value="#{row}"/>
              <f:selectItems id="isItem" value="#{row.choiceList}"/>
            </af:selectOneChoice>

Notice the f:attribute - this can pass any value to the backing bean in this case the row. - very bad for performance though.

Refresh on the component you need on value change:
in your value change listener : refreshDependantComponent("soc 2", valueChangeEvent.getComponent());



    private void refreshDependantComponent(String idMatch, UIComponent uiComponent) {
        UIComponent parent = uiComponent.getParent();
        Iterator iter = parent.getFacetsAndChildren();
        while (iter.hasNext()) {
            UIComponent iterItem = iter.next();
            if (iterItem.getId() != null && iterItem.getId().startsWith(idMatch)) {
                AdfFacesContext.getCurrentInstance().addPartialTarget(iterItem);
            }
        }
    }


Real solutions: : http://itnewscast.com/applications/how-populate-different-select-list-content-table-row
Or dont use immediate="true"

Thanks Jeromy for sending this to me and thanks Frank for the post.

Comments

Popular posts from this blog

ADF Encountered deferred syntax #{ in template text.

OracleJSP error: oracle.jsp.parse.JspParseException:  Error: Encountered deferred syntax #{ in template text.  If intended as a literal, escape it or set directive  deferredSyntaxAllowedAsLiteral This normally happens when you have some tag lib dependancy problems but this was  not the case for me... My problem: For some reason my model project had web stuff in it(public html etc)  so I had to remove the public html stuff from my project and manually edit the Model.jpr project file and remove the tag lib entries at the bottom o the file. Go figure.    

JBO-25013: TooManyObjectsException

oracle.jbo.TooManyObjectsException: JBO-25013: Too many objects match the primary key oracle.jbo.Key[Key null ]. Ok so for you it may be trying to insert a duplicate record this should explain your problem (also check trigger they could be the cause.) NOTE: You can also try to create a new duplicate EO if you have a page with two VO's using the same EO. This could sort your problems. For me I needed to add a launch listener on my LOV and clear the cache of my vo. LOV <af:inputListOfValues id="NameId" popupTitle="#{bindings.Name.hints.label}" value="#{bindings.RolName1.inputValue}" label="#{bindings.RolName1.hints.label}" model="#{bindings.RolName1.listOfValuesModel}" required="#{bindings.RolName1.hints.mandatory}" columns="#{bindings.RolName1.hints.displayWidth}" shortDesc="#{bindings.RolName1.hints.tooltip}" launchPopupListener="#{backingBeanScope.backingBean.launchPop

MANIFEST.MF merge JDeveloper for an executable jar

Goto your project > properties. Then click on deployment in the menu. Edit or add a jar deployment profile. Fill in the details under jar options (select Include manifest and give it a main class name) Also remember that the merge functionality only works with a BLANK line at the end of the merge file. REALLY this caught me. My merge file contents: Class-Path: commons-codec-1.3.jar [...empty line here CRLF...]