2014-09-04 23 views
12

Sto usando primefaces 5.0 per creare un DataTable dinamica.primefaces colonne statiche e dinamiche in datatable

mio DataObject ha alcuni campi obbligatori e un elenco di "Tupel" opzionale (coppia chiave-valore). L'elenco opzionale può variare nelle dimensioni. Pertanto ho bisogno di un meccanismo dinamico per mostrare un elenco di DataObject in Primefaces.DataTable.

Il mio approccio assomiglia:

public class DataObject { 
    private String staticval1; 
    private String staticval2; 

    private List<Tupel> optionalValues; 


    // .. getter, setter, hashCode, toString..... 
} 

public class Tupel{ 
    private String id; 
    private String value; 
} 

@ManagedBean 
@ViewScoped 
public class TableOverviewBean { 
    private List<DataObject> data; 

    @EJB 
    private IMyDao myDao; 

    @PostConstruct 
    public void init() { 
     data = myDao.findAll(); 
    } 

    public List<DataObject> getData() { 
     return data; 
    } 

    public void setData(List<DataObject> data) { 
     this.data = data; 
    } 
} 
<h:form> 
     <p:dataTable value="#{tableOverviewBean.data}" var="data"> 
      <p:column headerText="static1"> 
       <h:outputText value="#{data.staticval1}" /> 
      </p:column> 

      <p:column headerText="static2"> 
       <h:outputText value="#{data.staticval2}" /> 
      </p:column> 

      <p:columns value="#{data.optionalValues}" var="opt" headerText="#{opt.id}"> 
       <h:outputText value="#{opt.value}" /> 
      </p:columns> 
     </p:dataTable> 
    </h:form> 

Ma questo non funziona. Le colonne dinamiche non sono renderizzate. Come posso risolvere il mio problema?

EDIT: Risultato atteso:

staticval1 | staticval2 | dynamic_id1 | dynamic_id2 | ... | dynmic_idn 
---------------------------------------------------------------------- 
static1a | static2a | dyna_value1a| dyna_value2a | ... | dyna_valu3a 
static1b | static2b | dyna_value1b| dyna_value2b | ... | dyna_valu3b 
static1c | static2c | dyna_value1c| dyna_value2c | ... | dyna_valu3c 

risposta

16

Non è possibile definire le colonne in base ai dati di riga. Immagina che la riga 1 abbia 2 colonne, la riga 2 abbia 6 colonne, la riga 3 abbia 1 colonna, ecc. Come faresti mai a produrre una tabella tecnicamente valida in HTML? Ogni riga deve avere la stessa quantità di colonne.

Tu hai 2 opzioni, a seconda che può cambiare il modello oppure no:

  1. Se non è possibile modificare il modello, allora avete bisogno di sostituire quel <p:columns> da un singolo <p:column> e loop su il #{data.optionalValues} utilizzando un ciclo annidato con es <ui:repeat> o forse anche un altro <p:dataTable><p:columns>:

    <p:column> 
        <p:dataTable value=""><!-- Empty string as value forces 1 row. --> 
         <p:columns value="#{data.optionalValues}" var="opt" headerText="#{opt.id}"> 
          #{opt.value} 
         </p:columns> 
        </p:dataTable> 
    </p:column> 
    
  2. Se è possibile modificare il modello, allora avete bisogno di lasciare <p:columns value> punto a una proprietà di fagioli al posto di a una proprietà di fila, in modo che sia esattamente lo stesso per ogni riga. Questo funziona se si sostituisce List<Tupel> optionalValues dal Map<String, Tupel> optionalValues dove la chiave è Tupel#id e aggiunge una proprietà List<String> al fagiolo che contiene tutti i Tupel#id valori disponibili.

    <p:columns value="#{tableOverviewBean.availableTupelIds}" var="id" headerText="#{id}"> 
        #{data.optionalValues[id].value} 
    </p:columns> 
    
+0

Entrambe le soluzioni non risolvono veramente il mio problema. Ho aggiunto un esempio di output alla mia domanda. C'è un modo per ottenere un tavolo come questo? – veote

+0

Hai letto il 1 ° paragrafo? Se si desidera ottenere il layout necessario, è necessario spostare i dati da una riga a un altro e fornire una quantità fissa di colonne. – BalusC

+0

Sì, ho letto. Le mie file hanno la stessa quantità di colonne. Ma il numero di colonne può variare se ottengo un altro set di dati. Per esempio. una volta ci sono 10 valori opzionali (ogni dataobject ha 10). Un altro set può avere 8 valori optinal. – veote

0

java:

@Named 
@ViewScoped 
public class LiveRangeService implements Serializable { 
    private List< Map<String, ColumnModel> > tableData; 
    private List<ColumnModel> tableHeaderNames; 


    public List<Map<String, ColumnModel>> getTableData() { 
     return tableData; 
    } 
    public List<ColumnModel> getTableHeaderNames() { 
     return tableHeaderNames; 
    } 

    public void PlayListMB() { 
     tableData = new ArrayList< Map<String, ColumnModel> >(); 

     //Generate table header. 
     tableHeaderNames = new ArrayList<ColumnModel>(); 
     for (int j = 0; j < 5; j++) { 
       tableHeaderNames.add(new ColumnModel("header "+j, " col:"+ String.valueOf(j+1))); 
     } 

     //Generate table data. 
     for (int i = 0; i < 10; i++) { 
      Map<String, ColumnModel> playlist = new HashMap<String, ColumnModel>(); 
      for (int j = 0; j < 5; j++) { 
       playlist.put(tableHeaderNames.get(j).key,new ColumnModel(tableHeaderNames.get(j).key,"row:" + String.valueOf(i+1) +" col:"+ String.valueOf(j+1))); 
      } 
      tableData.add(playlist); 
     } 
    } 

    static public class ColumnModel implements Serializable { 

     private String key; 
     private String value; 

     public ColumnModel(String key, String value) { 
      this.key = key; 
      this.value = value; 
     } 

     public String getKey() { 
      return key; 
     } 

     public String getValue() { 
      return value; 
     } 
    } 

/////////////////////////////// /////////////

   <h:form> 

        <p:dataTable id="tbl" var="result" 
         value="#{liveRangeService.tableData}" 
         rendered="#{not empty liveRangeService.tableData}" 
         rowIndexVar="rowIndex" 
         > 

         <f:facet name="header"> header table </f:facet> 

         <p:column> 
          <f:facet name="header"> 
           <h:outputText value="序号" /> 
          </f:facet> 
          <h:outputText value="#{rowIndex+1}" /> 
         </p:column> 

         <p:columns value="#{liveRangeService.tableHeaderNames}" 
          var="mycolHeader" columnIndexVar="colIndex"> 
          <f:facet name="header"> 
           <h:outputText value="#{mycolHeader.value}" /> 

          </f:facet> 
          <h:outputText value="#{result[mycolHeader.key].value}" /> 
          <br /> 
         </p:columns> 

        </p:dataTable> 
       </h:form> 

Questo è un esempio.