具有动态列的可编辑数据表

时间:2013-03-08 05:08:35

标签: java richfaces seam jboss5.x jsf-1.2

我在JBoss 5上部署了一个Seam 2.2 JSF 1.2应用程序。我需要创建一个包含复杂可编辑数据表的页面;数据既可以显示也可以显示。

我有一名员工:

Employee {
    int id;
    String name;
    ...
}

我有认证类型:

Certs {
    int id;
    String certType;
    ...
)

我有员工持有Certs类型的活动:

Events {
    int id;
    int employeeId;
    int certId;
    Date start;
    Date end;
    ...
}  

我需要通过动态生成的证书类型显示数据(如果选择了多个证书类型,并且员工没有该证书类型的事件,则为该证书的单元格,证书类型应为空。

Valid XHTML

我可以使用rich:datatable with rich:columns和rich:column生成正确的格式,但这只是显示 - 我需要能够编辑到位的行。

我正在使用HtmlDataTable在backing bean中生成表,但是Seam在JSF绑定方面效果不佳。

对我来说,最难以理解的是将垂直数据(具有相关事件信息的员工,每个事件占一行)水平(员工事件事件事件)。

有人对有效处理此问题的最佳方法有任何建议或建议吗?

我会发布我尝试过的内容,但这已经很久了,所以我会根据需要添加更多内容。

1 个答案:

答案 0 :(得分:0)

我最终做的是使用组件组合来完成这项工作。 我创建了一个将员工数据行转换为一行的对象。所以来自db的数据返回: Jones certtype1 start end

Jones certtype2 start end

Jones certtype3 start end

变为:

Jones certtype1(开始,结束)certtype2(开始,结束)certtype3(开始,结束)

并组织起来:

 <rich:dataTable id="acadCertList"
value="#{myCertBean.employeeCertEventObjects}"
var="_certs" rowKeyVar="row" >

  <f:facet name="header">

<rich:columnGroup>
    <rich:column>
        <h:outputText value="Row" />
    </rich:column>
    <rich:column>
    <h:outputText value="Name" />
    </rich:column>

  <!-- dynamically create the certType1, certType2 …  column headers -->
    <rich:columns value="#{myCertBean.selectedCertTypeList}"
            var="_selCrtType" colspan="2">
        <h:outputText value="#{_selCrtType.certType}" />
    </rich:columns>
</rich:columnGroup>
 </f:facet>

 <rich:subTable value="#{_certs}" var="_cEmpObj">
<f:facet name="header">
  <!-- repeat start end column headers for each certType -->

    <rich:columnGroup>
        <rich:column>
 </rich:column>
        <rich:column>
        </rich:column>
        <c:forEach items="#{myCertBean.selectedCertTypeList}">
 <rich:column>
                <h:outputText value="Start" />
            </rich:column>
 <rich:column 
                <h:outputText value="End" />
            </rich:column>
 </c:forEach>
    </rich:columnGroup>
</f:facet>
 <!-- load data for each row -->

<rich:column id="row_#{row}">
    <h:outputText value="#{row+1}" />
</rich:column>
<rich:column id="name_#{row}">
    <h:outputText value="#{_cEmpObj.name}/>
</rich:column>

<c:forEach items="#{myCertBean.selectedCertTypeList}" varStatus="status">
    <rich:column id="curexp_#{status.index}" 
        <h:outputText
 value="#{_cEmpObj.certEventsByCertTypeSysid[status.index].startDate}" />
    </rich:column>
    <rich:column id="curexp_#{status.index}" 
        <h:outputText
 value="#{_cEmpObj.certEventsByCertTypeSysid[status.index].endDate}" />
    </rich:column>
 </c:forEach> 

 </rich:subTable>

 </rich:dataTable>