2014-09-04 17 views
12

Dinamik bir veritabam oluşturmak için Primefaces 5.0 kullanıyorum.Veritabanda statik ve dinamik sütunlar ön planda

DataObject ürününün bazı zorunlu alanları ve isteğe bağlı "tupel" listesi vardır (anahtar/değer çifti). İsteğe bağlı liste boyut olarak değişebilir. Bu nedenle, Primefaces.DataTable'da bir DataObject Listesini göstermek için dinamik bir mekanizmaya ihtiyacım var. Ama bu işe yaramazsa

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> 

: gibi

Benim yaklaşımım görünüyor. Dinamik sütunlar oluşturulmuyor. Sorunumu nasıl çözebilirim?

DÜZENLEME: Beklenen sonuç:

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 

cevap

16

satır verilerine dayanarak sütunları tanımlamak mümkün değildir. 1. satırda 2 sütunun, 2. satırda 6 sütunun, 3. satırda 1 sütunun vb. Olduğunu düşünün. HTML'de teknik olarak geçerli bir tablo nasıl oluşturursunuz? Her satırda aynı miktarda sütun bulunmalıdır. , O zaman üzerinde tek <p:column> ve besleme ile <p:columns> değiştirmeniz gerekiyor modelini değiştiremiyorsanız

  1. :

    Sen model veya değil değiştirebilir bağlı olarak 2 seçenek var #{data.optionalValues}, örneğin iç içe geçmiş bir döngü kullanarak <ui:repeat> hatta belki başka <p:dataTable><p:columns>: Eğer modelini değiştirebilir Eğer

    <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. , o zaman tam olarak her satır için aynı şekilde bir fasulye özelliğine yerine bir satır özelliğine <p:columns value> noktasını izin gerekiyor. Bu, 'un Map<String, Tupel> optionalValues anahtarının Tupel#id olduğu ve List<String> özelliğinin Tupel#id değerlerini içeren fasulyeye eklediğinizde çalışır.

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

Her iki çözüm de sorunumu gerçekten çözmez. Soruma bir örnek çıktı ekledim. Böyle bir tablo almanın bir yolu var mı? – veote

+0

1. paragrafı okudun mu? İhtiyacınız olan düzeni elde etmek istiyorsanız, verileri sıradan fasülyeye taşımak ve sabit miktarda sütun sağlamak zorundasınız. – BalusC

+0

Evet okudum. Benim satırlarımda aynı miktarda sütun var. Ancak başka bir veri kümesi alırsam sütun sayısı değişebilir. Örneğin. bir kez 10 opsiyonel değer vardır (her bir dataobject'in 10'u vardır). Başka bir sette 8 adet optik değer olabilir. – 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> 

Bu bir örnektir.