0

我使用 primefaces 的时间不长,我发现我不能使用 a<p:commandButton />因为它无法达到方法,方法没问题,我在表(和子表)之外尝试了它,它在那里完美运行(一切在表单内),问题是我需要用户能够选择所有子表,所以,我想也许有一个可能的按钮,但似乎子表不允许这样做,任何其他方式我能做到吗?或者也许我必须使用另一种方式从子表中调用我的方法,有人知道吗?

谢谢

我的一些代码

<h:form>
    <p:messages id="messages" showDetail="true" autoUpdate="true" closable="true" />  
    <p:dataTable id="case" var="ticket" value="#{CaseBean.selectedCase.tickets}">
        <p:columnGroup>
            <p:row>
                <p:column> Action:</p:column>
                <p:column>
                    <!-- This doesn't work, removed. -->
                    <p:commandButton value="Aprove" action="#{CaseBean.acept()}">
                    </p:commandButton>
                </p:column>
            </p:row>
        </p:columnGroup>

        <p:subTable var="detail" value="#{ticket.detail}">
            <f:facet name="header">
                Resume:
            </f:facet>
            <!-- some data... -->
            <p:column>
                <!-- doesn't work either -->
                <p:commandButton value="Aprove" action="#{CaseBean.aceptTicket()}">
                </p:commandButton>
            </p:column>
<!-- show my data -->

该表运行良好,它显示了所有数据,日志文件没有显示任何错误,因此,当我尝试将我的 commandButton 从表中写入它时,它运行良好,如果我不能将它写在子表中它可以,但是,我怎么能把它写在表里?它也没有出现在那里。

4

4 回答 4

1

你欢迎:) 但如果我是你我不会使用子表,我会考虑另一种解决方案..也许我会这样做,我会使用两个不同的数据表,第一个包含父列表,第二个包含子列表列表元素,所做的每个选择都会触发第二个表的更新...我在我的 IDE 上尝试过,它工作得很好

<h:form id="form">
<p:dataTable var="cas" value="#{beanCase.myListOfCase}"
    selection="#{beanCase.selectedCase}" rowKey="#{cas.idCase}"
    selectionMode="single">
    <p:ajax event="rowSelect" update=":form:TicketTable" />
    <p:column headerText="Id Case">
        <h:outputText value="#{cas.idCase}" />
    </p:column>
    <p:column headerText="Case Name ">
        <h:outputText value="#{cas.caseName}" />
    </p:column>
    <p:column headerText="Case Detail">
        <h:outputText value="#{cas.caseDetail}" />
    </p:column>
    <p:column headerText="Action">
        <p:commandButton value="Accept Case" update=":form:TicketTable"></p:commandButton>
    </p:column>
</p:dataTable>
<p:dataTable id="TicketTable" var="ticket"
    value="#{beanCase.selectedCase.tickets}">
    <p:column headerText="Ticket Number">
        <h:outputText value="#{ticket.idTicket}" />
    </p:column>
    <p:column headerText="Ticket Details">
        <h:outputText value="#{ticket.labelTicket}" />
    </p:column>
    <p:column headerText="show">
        <h:outputText value="#{ticket.show}" />
    </p:column>
    <p:column headerText="this show is brought to you by">
        <h:outputText value="#{ticket.sponsor}" />
    </p:column>
    <p:column headerText="Make a Reservation">
        <p:commandButton value="Buy" action="#{beanCase.buyTicket()}">
            <f:setPropertyActionListener value="#{ticket}"
                target="#{beanCase.selectedTicket}" />
        </p:commandButton>
    </p:column>
</p:dataTable>

在此之前,您必须为案例和工单创建数据模型类

public class CaseDataModel extends ListDataModel<Case> implements
    SelectableDataModel<Case> {
CaseDAO caseDAO = new CaseDAO();

public CaseDataModel() {
}

public CaseDataModel(List<Case> cases) {
    super(cases);
}

@Override
public Case getRowData(String arg0) {
    List<Case> listOfMyObjet = (List<Case>) caseDAO.findAll();
    for (Case obj : listOfMyObjet) {
        if (String.valueOf(obj.getIdCase()).equals(arg0))
            ;
        return obj;
    }
    return null;
}

@Override
public String getRowKey(Case arg0) {
    return String.valueOf(arg0.getIdCase());
}

}

于 2012-10-23T01:23:24.653 回答
0

第一个 columnGroup 未呈现,因为在您的第一行中,列数为 2,一个用于“action”,另一个用于 commandButton,而在您的子表中,您只使用了两行,一个用于“Resume”,其他仅包含一个用于另一个命令按钮。每行的列数应该相同,因此您必须使用colspanrowspan来确保这一点。至于其余的使用DataTable来完成这项工作,我不明白你到底想做什么,但我都假设你想从 dataTable 中显示的对象列表中选择 myObject。因此,为了实现这一点,UidataTable必须将一个对象返回给支持的 Bean。

public class myObjectDataModel extends ListDataModel<myObject> implements SelectableDataModel<myObject> {    

    public myObjectDataModel() {  
    }  

    public myObjectDataModel(List<myObject> data) {  
        super(data);  
    }  

    @Override  
    public myObject getRowData(String rowKey) {         
       List<myObject> listOfMyObjet = (List<myObject>) yourDao.getListOfmyOjects();//get your list

        for(myObject obj : listOfMyObjet) {  
            if(obj.getIdObject().equals(rowKey))  
                return obj;  
        }  

        return null;  
    }  

    @Override  
    public Object getRowKey(myObject obj) {  
        return obj.getIdObject();  
    }
}

支持的bean:

public class tableBean {
    private List<myObject> _Objects;
    private myObjectDataModel myListOfObjects;
    private myObject selectedObject;
    //getters and setters
    public tableBean(){
        myObjectDataModel = new myObjectDataModel(_Objects);
    }
    //...
}

xhtml:

<p:dataTable id="table" var="case"
    value="#{tableBean.myObjectDataModel}"
    selection="#{tableBean.selectedObject}" selectionMode="single"
    rowKey="#{case.IdObject}">
    <p:column>

        <p:commandButton value="
    Aprove" action="#{tableBean.someMethod()}">
        </p:commandButton>
    </p:column>

</p:dataTable>

并确保使用 Ajax — commandButton 更新属性,或者<p:ajax>— 刷新您的 UI。

于 2012-10-21T08:15:37.300 回答
0

尝试p:columnGroup从您的 JSF 页面中删除 。您不需要它(这可能是您的问题的原因)。可以这样想:一个表存在行,行存在列。;-)

于 2012-10-22T05:21:48.870 回答
0

#{CaseBean}必须在视图范围内才能使其正常工作,或者如果您想保持它的请求范围,则必须#{CaseBean.selectedCase.tickets}在(后)构造函数中准备一些请求参数,以便它与以前完全相同在显示表格期间。

当表单被提交时,JSF 即会在表格上重复一遍,以便找到负责该动作的命令组件。但是,如果 bean 是请求范围的,并且后面的值#{CaseBean.selectedCase}or#{CaseBean.selectedCase.tickets}与显示表期间的值不同,那么 JSF 将无法识别调用该操作的按钮

也可以看看:

于 2012-10-23T11:22:57.120 回答