2012-02-16 12 views
0

primefaces 포럼의 this 게시물을 참조하십시오.
누군가가 동일한 페이지에서 여러 datatable을 어떻게 사용할 수 있습니까?
내 문제는 속성이 데이터베이스의 다른 테이블에있는 데이터를 포함하는 뷰 범위 Bean이 있다는 것입니다. 각 데이터베이스 테이블의 데이터에 대해 여러 데이터 테이블이 있습니다. 이제 <p:selectOneMenu> (붉은 색으로 둘러싸인)에서 선택된 기본 값으로 데이터 테이블을 표시하려고합니다.
이 스크린 샷은 조금 더 설명 할 것입니다.데이터 테이블 그룹에서 정확한 데이터 테이블 표시

image http://s19.postimage.org/qxugwevxf/image.jpg

+1

올바른 데이터 테이블은 무엇입니까? jsf에서는 조건부 렌더링이 표준입니다. –

+0

죄송합니다. JSF가 처음 인 이유는 선택한 데이터 테이블의 가시성을 변경하는 방법을 알지 못했기 때문입니다. –

+0

그건 그렇고, 내 질문을 업데이트했습니다 –

답변

2

기본적인 접근 방식은 테이블의 rendered 속성은 메뉴의 선택 항목에 따라 다릅니다 수 있도록하는 것입니다.

<p:selectOneMenu value="#{bean.table}"> 
    <f:selectItem itemValue="players" itemLabel="Players" /> 
    <f:selectItem itemValue="jobs" itemLabel="Jobs" /> 
    <f:selectItem itemValue="business" itemLabel="Business" /> 
    ... 
    <p:ajax update="tables" /> 
</p:selectOneMenu> 

<h:panelGroup id="tables"> 
    <p:dataTable value="#{bean.players}" rendered="#{bean.table == 'players'}"> 
     ... 
    </p:dataTable> 
    <p:dataTable value="#{bean.jobs}" rendered="#{bean.table == 'jobs'}"> 
     ... 
    </p:dataTable> 
    <p:dataTable value="#{bean.business}" rendered="#{bean.table == 'business'}"> 
     ... 
    </p:dataTable> 
    ... 
</h:panelGroup> 

이 쉽게 구현할 수 있지만 (물론 <ui:include> 파일에 걸쳐 분할 할 수 있습니다) 뷰에서 많은 코드와 끝까지. 보다 진보되고 재사용 가능한 접근법은 단일 테이블의 value이 메뉴의 선택된 항목에 의존하고 <p:columns>을 사용하여 동적으로 열을 생성하는 것입니다. 같은 뭔가

<p:selectOneMenu value="#{bean.table}"> 
    <f:selectItems value="#{bean.tables}" /> 
    <p:ajax listener="#{bean.changeModel}" update="table" /> 
</p:selectOneMenu> 

<p:dataTable id="table" value="#{bean.model}" var="item"> 
    <p:columns value="#{bean.columns}" var="column"> 
     <h:outputText value="#{item[column]}" /> 
    </p:columns> 
</p:dataTable> 

:이 내용은 좀 더 전문화 된 열을 추가 할 때마다 덜 세밀하게 제어 할 수 있습니다

public void changeModel() { 
    model = populateModelBasedOn(table); 
    columns = populateColumnsBasedOn(table); 
} 

. 아마도 태그 파일로 대신 작업하고 싶을 것입니다.

+0

답장을 보내 주셔서 감사합니다.제 의도는 당신이 언급 한 모든 것을하는 것이 었습니다. 어떤 접근 방식이 더 유용 할 지 제안 해주십시오. 태그 파일, 컴포지트 구성 요소 또는 선택한 값을 기준으로 테이블 모델 변경? –

+0

제 질문에, 저는 primefaces 포럼에서 [Post] (http://forum.primefaces.org/viewtopic.php?f=3&t=18365&p=57049#p56921)를 언급했습니다. 누군가 내게 말했다 : "또는 많은 데이터 테이블을 사용하지만 rendered ="# {myBean.condition} "을 사용하면 올바른 데이터 테이블 만 표시) = ui : include + ui : params와 함께 사용하면 동일한 데이터 테이블에 대해 하나의 코드 만 사용할 수 있습니다! " 어떻게 이걸 이룰 수 있니? –

0

하나님의 은혜로. 많은 투쟁 끝에! 마침내 이루었습니다 this!
그의 전문가 팁은 BalusC에 감사합니다.
그래서 모든 것을 공유하고 싶습니다. 그래서 여기
내가 내 XHTML 파일에서 한 것입니다 :

<p:selectOneMenu value="#{dbmBean.selectedTable}" style="height:27px" > 
    <c:forEach items="#{dbmBean.tableNames}" var="table"> 
     <f:selectItem itemLabel="#{table.value}" itemValue="#{table.key}"/> 
    </c:forEach> 
</p:selectOneMenu> 
<p:commandButton value="Go" action="#{dbmBean.goToTable}" ajax="false" /> 
... 
<p:dataTable binding="#{dbmBean.table}" var="row" rowIndexVar="index"> 
<f:facet name="header"/> 
<p:columns value="#{dbmBean.columns}" var="column" columnIndexVar="colIndex" > 
     <f:facet name="header"> 
      #{column.header} 
     </f:facet> 
     <h:outputText value="#{row[column.property]}"/> 
    </p:columns> 
</p:dataTable> 

과 백킹 빈에서

:이 화면에서 원하는대로

public class DatabaseManagerBean implements Serializable { 
    private List<ColumnModel> columns; // Column model is a simple class with two string properties: header, property 
    ...  
    public void goToTable() { 
     int tableIndex = new Integer(this.selectedTable); 
     switch (tableIndex) { 
      case 1: 
       Players tempPlayers = new Players(); //the class which get data from a database table 
       this.players = tempPlayers.getAllPlayers(); 
       this.columnNames = tempPlayers.getColumnNames(); 
       for (String colName : columnNames) { 
        columns.add(new ColumnModel(colName.toUpperCase(), colName)); 
       } 
       table.setRendered(true); 
       table.setValue(this.players); 
       break; 
       ... 
       default: 
       table.setRendered(false); 
     } //end of switch statement 
    } //end of goToTable() method 
} //end of DatabaseManagerBean 

이 코드가 정확히 작동합니다! :-)

image http://s19.postimage.org/kt8xiy80z/image.png

사람을 찾을 일이 원인 불명 또는 실종 왼쪽 또한 경우에, 코멘트를 작성하시기 바랍니다.
그리고 BalusC에게 다시 모자를 벗습니다. 그의 암시가 없기 때문에 나는이 목표를 성취 할 수 없을 것입니다. :-)
저는 Optimus Prime과 PrimeFaces 팀에게 멋진 얼굴을 만들어 주신 것에 감사드립니다. :-)
나는 Stackoverflow 팀에게 감사의 말을 전합니다. 그런 토론을 할 수있는 멋진 플랫폼을 제공했습니다! :-)
모두 감사합니다! :-)