在Primefaces数据表中渲染不同的列

时间:2014-08-04 09:28:01

标签: jsf primefaces datatable radio-button javabeans

我的页面上有一个数据表,其中包含列单位/设置,车辆,下一维护,第1天,......,第7天。我有两个单选按钮也可以更改数据的排序,当我更改为按日期排序而不是单位/设置列的其他单选按钮应更改为日期,考试,B考试,C考试,......

我假设我需要创建两个数据表,然后使用rendered属性来决定显示哪个表,具体取决于选择的类型。

<p:dataTable id="dataTableEnquiryNextDue" styleClass="editable-datatable"
                rows="20"
                scrollable="true"
                frozenColumns="2"
                rendered=>                                          
                <p:column headerText="Unit/Set" />
                <p:column headerText="Vehicle" />
                <p:column headerText="Next Maintenance" />
                <p:column headerText="Day 1" />
                <p:column headerText="Day 2" />
                <p:column headerText="Day 3" />
                <p:column headerText="Day 4" />
                <p:column headerText="Day 5" />
                <p:column headerText="Day 6" />
                <p:column headerText="Day 7" />|
            </p:dataTable>

这是我的数据表代码,除了我在那一刻留下了渲染的空白,我相信我必须制作某种bean,我认为它会获得单选按钮的价值然后我会有像

这样的东西
rendered="#{Bean.searchSort == Unit}

rendered="#{Bean.searchSort == Date}

我使用以下代码

创建了一个bean
@ManagedBean

@ViewScoped 公共类DepotWorkloadBean实现Serializable {

public enum Sort    {
    UNIT, DATE
}

private Sort sortMode = Sort.UNIT;

public Sort getSortMode() {
    return sortMode;
}

public void enterUnitSort() {
    sortMode = Sort.UNIT;       
}

public void enterDateSort() {
    sortMode = Sort.DATE;
}

}

在我的表格中添加了一行

rendered="#{depotWorkloadBean.sortMode == 'UNIT'}"

我也用同样的方式创建了我的另一个表,但是用

rendered="#{depotWorkloadBean.sortMode == 'DATE'}"

和不同的专栏。

对于我的单选按钮,我写了

            <p:radioButton id="UnitSetNumber" for="customRadio3" itemIndex="0"  
        onchange="#{depotWorkloadBean.enterUnitSort}" update="dataTableDaySortUnit dataTableDaySortDate"/>

            <p:radioButton id="DateDue" for="customRadio3" itemIndex="1"
        onchange="#{depotWorkloadBean.enterDateSort}" update="dataTableDaySortUnit dataTableDaySortDate"/>

目前我收到错误

班级&#39; DepotWorkloadBean&#39;没有属性&#39; enterUnitSort&#39;。

这显然很混乱,据我所知,我已经正确拼写了一切。我仍然不确定我的方法是否真的正确,所以再次提出任何建议都将不胜感激。

这是我的selectOneRadio

                <p:selectOneRadio id="customRadio3" layout="custom">
                <f:selectItem itemLabel="UnitSetNumber" itemValue="1" binding="{depotWorkloadBean.enterUnitSort}"
                update=":mainForm"/>
                <!-- <f:ajax listener="#{depotWorkloadBean.enterUnitSort}" render="@all"/> -->
                <f:selectItem itemLabel="DateDue" itemValue="2" binding="{depotWorkloadBean.enterDateSort}"
                update=":mainForm"/>
                <!-- <f:ajax listener="#{depotWorkloadBean.enterDateSort}" render="@all"/> -->
                <f:selectItem itemLabel="DueInValue" itemValue="3" />
            </p:selectOneRadio>

编辑:这是我更新的selectOneRadio

<p:selectOneRadio id="customRadio3" layout="custom"
            value="#{depotWorkloadBean.sortMode}"
            update=":mainForm">
                <f:selectItem itemLabel="UNIT.name" itemValue="UNIT" value="#{depotWorkloadBean.sortMode}"
                var="UNIT"/>
                <!-- <f:ajax listener="#{depotWorkloadBean.enterUnitSort}" render="@all"/> -->
                <f:selectItem itemLabel="DATE.name" itemValue="DATE" value="#{depotWorkloadBean.sortMode}"
                var="DATE"/>
                <!-- <f:ajax listener="#{depotWorkloadBean.enterDateSort}" render="@all"/> -->
                <f:selectItem itemLabel="DueInValue" itemValue="3" />
            </p:selectOneRadio>

这是我更新的bean

@ManagedBean
@ViewScoped
public class DepotWorkloadBean implements Serializable {



   public enum Sort {
        UNIT, DATE
    }

    private Sort sortMode = Sort.UNIT;

    public Sort getSortMode() {
        return sortMode;
    }

    public Sort[] getSortValues() {
        return Sort.values();
    }

    public void setSortMode(Sort sortMode) {
        this.sortMode = sortMode;
    }
}
编辑:经过一番思考后,我采取了一种新的方法,所以现在我的单选按钮组是这样的:

    <!-- <f:facet name="actions"> -->
        <p:selectOneRadio id="customRadio3" layout="custom"
        partialSubmit="true"
        value="#{depotWorkloadBean.selectSort}">
            <p:ajax update="mainForm" listener="#{depotWorkloadBean.updateSortMode}"/>
            <f:selectItem itemLabel="UnitSet" itemValue="UnitSet"/>        
            <f:selectItem itemLabel="DateDue" itemValue="DateDue"/>            
            <f:selectItem itemLabel="DueInValue" itemValue="DueInValue"/>                     
        </p:selectOneRadio>
    <!-- </f:facet> -->

我已经注释掉了facet标签,因为它会导致错误 "javax.servlet.ServletException"我不明白为什么。

我的表格和以前一样,除了渲染的行现在是

rendered="#{depotWorkloadBean.sortMode == 'UnitSet'}">

和&#39; DateDue&#39;类似。我的bean如下:

@ManagedBean
@ViewScoped
public class DepotWorkloadBean implements Serializable {

private static final Log log = LogFactory.getLog(DepotWorkloadBean.class);

/*public enum Sort {
    UNIT, DATE
}

private Sort sortMode = Sort.UNIT;*/

private String sortMode = "UnitSet";
private String selectSort = "UnitSet";

public void updateSortMode () {
    log.info("In updateSortMode " + " State [" + selectSort + "]");
    sortMode = selectSort;
}

public String getSortMode() {
    return sortMode;
}

public void setSortMode(String sortMode) {
    this.sortMode = sortMode;
}

public String getSelectSort() {
    return selectSort;
}

public void setSelectSort(String selectSort) {
    log.info("Setting selectSort to [" + selectSort + "]");
    this.selectSort = selectSort;
    sortMode = selectSort;
}

我刚刚发现了日志,看起来非常有用。当我的页面构建时,我在单选按钮之间单击我的日志记录&#39;在updateSortMode State []&#39; &#34;将selectSort设置为State []&#34;所以这个方法显然有问题。我应该提到的另一件事是我的单选按钮实际上是在同一个panelGrid中进一步显示的,就像这样......

        <p:row>
    <p:column>
        <p:radioButton id="UnitSetNumber" for="customRadio3" itemIndex="0"/>
    </p:column>    
    <p:column>
        <h:outputLabel for="UnitSetNumber" value="Unit/set number" />
    </p:column>        
    </p:row>
    <p:row>
    <p:column>
        <p:radioButton id="DateDue" for="customRadio3" itemIndex="1"/>
    </p:column>    
    <p:column>
        <h:outputLabel for="DateDue" value="Date due" />
    </p:column>        
    </p:row>
    <p:row>
    <p:column>
        <p:radioButton id="DueInValue" for="customRadio3" itemIndex="2" />
    </p:column>    
    <p:column>
        <h:outputLabel for="DueInValue" value="Due in value" />
    </p:column>        
    </p:row>   

不确定这是否会影响ajax监听器?

由于

1 个答案:

答案 0 :(得分:1)

您不需要onchange侦听器,update=属性可以完成此任务。

使用带有嵌套<p:selectOneRadio>的{​​{1}},它将设置bean的<f:selectitems>值(您可能需要转换器)。然后确保在选择时更新两个表的父组件。这将使用新设置的sortMode值重新评估表的rendered=属性。

实施例: 观点:

sortMode

豆子:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>TEST</title>
    </h:head>
    <h:body>
        <h:form>
            <p:selectOneRadio id="radiogroup"
                              value="#{testController.selectedValue}">
                <f:ajax render=":content"/>
                <f:selectItems value="#{testController.valuesTypes}"
                               var="val"
                               itemLabel="#{val.name()}"
                               itemValue="#{val}"/>
            </p:selectOneRadio>
        </h:form>
        <h:form id="content">
            <p:outputPanel rendered="#{testController.selectedValue eq 'VALUEA'}">
                Value A panel
            </p:outputPanel>
            <p:outputPanel rendered="#{testController.selectedValue eq 'VALUEB'}">
                Value B panel
            </p:outputPanel>
            <p:outputPanel rendered="#{testController.selectedValue eq 'VALUEC'}">
                Value C panel
            </p:outputPanel>
        </h:form>
    </h:body>
</html>