Surya
Surya

Reputation: 426

render column in jsf datatable first time only

as per my requirement I have to show a delete button end of row in datattable but restriction is to show only for first row, not in each row. how to restrict it

belwo is my datatable

<h:dataTable id="datatable"  value="#{relationBean.languageDTOList}" var="lang">
<h:column>
    <f:facet name="header"> Relation Type Name</f:facet>
    <h:outputText value="#{relationBean.relationName}" />
</h:column>
<h:column>
    <f:facet name="header"> Value</f:facet>
    <h:inputText />
</h:column>
<h:column>
    <f:facet name="header">language</f:facet>
    <h:outputText value="#{lang.languageName}" />
</h:column>
<h:column>
    <f:facet name="header"> Delete</f:facet>

    <p:commandLink rendered="" action="#{relationBean.deleteDataTable}" immediate="true" update="@form" process="@this">
                <h:graphicImage value="../images/delete.png"  />
                <f:setPropertyActionListener target="#{relationBean.deleteId}" value="#{var}" />
     </p:commandLink>
        </h:column>

Bean.java its showing contents of bean

public List<LanguageDTO> getLanguageDTOList() {
    System.out.println("RelationBean:getLanguageDTOList:Enter");
    CountryList = new ArrayList<Country>();
    try {
        CountryList.add(countryService.getCountryByCode(city));
        List<LanguageDTO> tempLangDTOlst=new ArrayList<LanguageDTO>();
        for (Country lang : CountryList) {
            LanguageDTO languageDTO = new LanguageDTO();
            for (CountryLanguage CLang : lang.getCountryLanguage()) {
                languageDTO =  new LanguageDTO();
                languageDTO.setLanguageName(CLang.getLanguage().getLanguageName());
                languageDTO.setLanguageCode(CLang.getLanguage().getLanguageCode());
                System.out.println(CLang.getLanguage().getLanguageName());
                tempLangDTOlst.add(languageDTO);
            }

        }
        setLanguageDTOList(tempLangDTOlst);
        System.out.println("languageDTOList :"+languageDTOList);

    } catch (Exception e) {
        e.printStackTrace();
    }
    //BeanUtils.copyProperties(tempLangDTO,languageDTOList);
    System.out.println("--------------------Start -------------");
    for (LanguageDTO iterable_element : languageDTOList) {
        System.out.println(iterable_element.getLanguageName());
    }
    System.out.println("-------------------- End -------------");
    System.out.println("RelationBean:getLanguageDTOList:Exit");
    return languageDTOList;
}

Upvotes: 0

Views: 1831

Answers (2)

BalusC
BalusC

Reputation: 1109715

Bind the <h:dataTable> to the view via binding, which will reference an UIData component instance and in the rendered attribute just check if UIData#getRowIndex() equals to 0.

<h:dataTable binding="#{table}" ...>
    <h:column>
        <p:commandLink ... rendered="#{table.rowIndex eq 0}">

(note: do not bind it to a bean like #{bean.table}! the code is complete as-is)

See also:

Upvotes: 2

LaurentG
LaurentG

Reputation: 11827

You can test if the current element is the same as the first element of your list:

<p:commandLink rendered="#{lang eq relationBean.languageDTOList.get(0)}"> ...

This would works only if languageDTOList is a List.

If you were using p:dataTable instead of the standard JSF DataTable, you could use the rowIndexVar variable to test if your are at the first iteration.

Upvotes: 1

Related Questions