2014-09-04 13 views
12

Tôi đang sử dụng Primefaces 5.0 để tạo một dữ liệu động.Thủ tướng các cột tĩnh và động trong datatable

DataObject của tôi có một số trường bắt buộc và Danh sách tùy chọn "tupel" (cặp khóa-giá trị). Danh sách tùy chọn có thể khác nhau về kích thước. Vì vậy, tôi cần một cơ chế năng động để hiển thị một danh sách DataObject trong Primefaces.DataTable.

Tiếp cận của tôi trông giống như:

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> 

Nhưng điều này không làm việc. Các cột động không được hiển thị. Tôi có thể giải quyết vấn đề của mình bằng cách nào?

EDIT: Kết quả mong đợi:

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 

Trả lời

16

Nó không phải là có thể xác định các cột dựa trên dữ liệu hàng. Hãy tưởng tượng rằng hàng 1 có 2 cột, hàng 2 có 6 cột, hàng 3 có 1 cột, v.v ... bạn sẽ bao giờ sản xuất một bảng hợp lệ về mặt kỹ thuật bằng HTML? Mỗi hàng phải có cùng số cột.

Bạn đã 2 lựa chọn, tùy thuộc vào việc có thể thay đổi các mô hình hay không:

  1. Nếu bạn không thể thay đổi mô hình, sau đó bạn cần phải thay thế mà <p:columns> bởi một đơn <p:column> và lặp trên các #{data.optionalValues} bằng cách sử dụng một vòng lặp lồng nhau với ví dụ <ui:repeat> hoặc thậm chí khác <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. Nếu bạn có thể thay đổi mô hình, sau đó bạn cần phải cho <p:columns value> điểm đến một tài sản đậu thay vì để một tài sản hàng, do đó nó là giống hệt nhau cho mỗi hàng. Điều này hoạt động nếu bạn thay thế List<Tupel> optionalValues bởi Map<String, Tupel> optionalValues trong đó khóa là Tupel#id và thêm thuộc tính List<String> vào bean chứa tất cả các giá trị có sẵn Tupel#id.

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

Cả hai giải pháp đều không thực sự giải quyết được vấn đề của tôi. Tôi đã thêm một kết quả ví dụ cho câu hỏi của mình. Có cách nào để có được một cái bàn như thế này không? – veote

+0

Bạn đã đọc đoạn 1 chưa? Nếu bạn muốn đạt được bố cục bạn cần, bạn phải di chuyển dữ liệu từ hàng này sang hàng khác và cung cấp số cột cố định. – BalusC

+0

Có, tôi đã đọc. Các hàng của tôi có cùng số cột. Nhưng số lượng cột có thể thay đổi nếu tôi nhận được một tập dữ liệu khác. Ví dụ. một lần có 10 giá trị tùy chọn (mỗi dataobject có 10). Một bộ khác có thể có 8 giá trị 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> 

Đó là ví dụ.

Các vấn đề liên quan