我正在使用primefaces不久,我发现我不能使用<p:commandButton />
,因为它无法到达方法,方法没问题,我尝试了表格(和子表格) )并且它在那里工作得很好(一切都在一个表格内),问题是我需要用户能够选择所有的子表,所以,我想可能有一个可能的按钮,但看起来像subtable doesn'允许这样,我可以做任何其他方式吗?或者我可能必须使用另一种方式从子表中调用我的方法,有人知道吗?
由于
我的一些代码
<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时它工作得很好,如果我不能在子表中写入它好的,但是,我怎么能在表中写出来?它也没有出现在那里。
答案 0 :(得分: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>
之前,您必须为Case和ticket
创建数据模型类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());
}
}
答案 1 :(得分:0)
第一个columnGroup未呈现,因为在第一行中,列数为2,一个用于“action”,另一个用于commandButton,而在子表中,您只使用了两行一个用于“Resume”而其他只包含另一个commandButton的一列。 每列的列数应相同,因此您必须使用 colspan 或 rowspan 来确保这一点。 至于使用 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。
答案 2 :(得分:0)
尝试从JSF页面中删除p:columnGroup
。你不需要它(这可能是你的问题的原因)。可以这样想:存在列的行和行存在的表。 ; - )
答案 3 :(得分:0)
#{CaseBean}
必须位于视图范围内才能使其生效,或者如果要保持请求作用域,#{CaseBean.selectedCase.tickets}
必须在(post)构造函数中准备在某些请求参数上,使其完全与显示表格时相同。
提交表单时,JSF将重复表格,以便找到负责该操作的命令组件。但是,如果bean是请求作用域,并且#{CaseBean.selectedCase}
或#{CaseBean.selectedCase.tickets}
后面的值不与显示表时相同,则JSF将无法识别调用该动作的按钮。