p:column rendered attribute does not seem to work with p:dataTable var

NDeveloper picture NDeveloper · Jun 7, 2013 · Viewed 9.8k times · Source

I have written a code like:

<p:column headerText="Edit" width="40" rendered="#{(leaveDetails.strLeaveStatus == 'Canceled') or (leaveDetails.strLeaveStatus == 'Availed')}">
    <p:commandLink actionListener="#{userLeaveBean.editAppliedLeave}" title="Edit" disabled="true" process="@this" update="leaveDataTable" immediate="false">
        <h:graphicImage url="resources/images/edit.JPG"/>
            <f:attribute name="userId" value="#{employee.name}"/>
            <f:attribute name="editFirstHalf" value="#{leaveDetails.strStartTiming}"/>
            <f:attribute name="editSecondHalf" value="#{leaveDetails.strEndTiming}"/>
            <f:attribute name="editFrom" value="#{leaveDetails.dtLeaveFromDate}"/>
            <f:attribute name="editTo" value="#{leaveDetails.dtLeaveToDate}"/>
            <f:attribute name="leaveId" value="#{leaveDetails.strLeaveId}"/>
    </p:commandLink>
</p:column>

But the rendered attribute is not working for the condition. How can I use the logical operator to make the condition work?Using PrimeFaces 3.4.2

Answer

BalusC picture BalusC · Jun 7, 2013

You can't conditionally render a whole column on a per-row basis. This makes logically no utter sense. You can only conditionally render it on a per-table basis. The <p:column rendered> cannot take a condition based on properties of the iterated row. It can only take a condition based on properties of the parent bean.

If you intend to conditionally hide only the cell of the currently iterated row, then just move the rendered attribute from <p:column> to <p:commandLink> or at least a component which wraps the whole <p:column> content, such as <h:panelGroup>.

Or if you really intend to conditionally hide a whole column, then move the conditions used in rendered attribute of <p:column> to the #{userLeaveBean} parent bean.