Jsf 2 Primefaces数据表动态选择不工作
在我的应用程序中,我需要为datatable(我使用的是primefaces 5.0)动态地决定选择模式“single”或“multiple”,这取决于指定的选择。下面是我绑定的el表达式Jsf 2 Primefaces数据表动态选择不工作,jsf-2,primefaces,datatable,Jsf 2,Primefaces,Datatable,在我的应用程序中,我需要为datatable(我使用的是primefaces 5.0)动态地决定选择模式“single”或“multiple”,这取决于指定的选择。下面是我绑定的el表达式 XHTML: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:cc="http://java.sun.com
XHTML:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:cc="http://java.sun.com/jsf/composite"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<h:head>
<title>Primefaces Data Table</title>
<script type="text/javascript" src="Test.js"/>
</h:head>
<h:body>
<h:form id="form">
<p:growl id="msgs" showDetail="true" />
<p:dataTable id="T" var="car" widgetVar="T_wv" value="#{ECTestScreen.cars}" selectionMode="#{ECTestScreen.selectionMode}" selection="#{ECTestScreen.selectionMode ne 'multiple'? ECTestScreen.selectedCar :ECTestScreen.selectedCars}" rowKey="#{car.id}" paginator="true" rows="5" paginatorAlwaysVisible="true">
<f:facet name="header">
Row Selection on Click
</f:facet>
<p:column headerText="Car Id">
<h:outputText value="#{car.id}" />
</p:column>
<p:column headerText="Year">
<h:outputText value="#{car.year}" />
</p:column>
<p:column headerText="Brand">
<p:inputTextarea id="ta" rows="10" cols="30" style="height: 22px; overflow:auto;" value="#{car.brand}" />
</p:column>
<p:column headerText="Color">
<h:inputText value="#{car.color}" onmouseup="onCellFocus1(event, $(this).parent(), [{name: 'screenletId', value: 'T'}, {name: 'rowIndex', value: '5'}, {name: 'colName', value: 'Color'}]);"/>
</p:column>
<p:ajax event="rowSelect" listener="#{ECTestScreen.onRowSelect}" update=":form:msgs" />
</p:dataTable>
<p:commandButton value="Update Table" actionListener="#{ECTestScreen.onButtonClick}"/>
</h:form>
</h:body>
</html>
XHTML:
Primefaces数据表
单击即可选择行
Java代码:
@ManagedBean(name = "ECTestScreen")
@ViewScoped
public class ECTestScreen implements Serializable {
private static final long serialVersionUID = -855625904411046273L;
private List<String> products = new ArrayList<>();
private List<Integer> rowList = new ArrayList<>();
private List<Car> cars = new ArrayList<>();
private Car selectedCar ;
private List<Car> selectedCars = new ArrayList<>();
private String selectionMode="multiple";
public List<Integer> getRowList() {
return rowList;
}
public void setRowList(List<Integer> rowList) {
this.rowList = rowList;
}
public List<String> getProducts() {
return products;
}
public void setProducts(List<String> products) {
this.products = products;
}
public List<Car> getCars() {
for(int j=1; j<10;j++){
this.cars.add(new Car(j, (2000+j), "Merc-"+j, "Black-"+j));
}
return cars;
}
public void setCars(List<Car> cars) {
this.cars = cars;
}
public Car getSelectedCar() {
return selectedCar;
}
public void setSelectedCar(Car selectedCar) {
this.selectedCar = selectedCar;
}
public List<Car> getSelectedCars() {
FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("form");
return selectedCars;
}
public void setSelectedCars(List<Car> selectedCars) {
this.selectedCars = selectedCars;
}
public String onButtonClick(){
for(int i=1; i<6; i++){
rowList.add(i);
}
for(int j=1; j<4;j++){
products.add("td="+j);
}
for(int j=1; j<10;j++){
cars.add(new Car(j, (2000+j), "Merc-"+j, "Black-"+j));
}
FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("form");
return "";
}
public String getSelectionMode(){
return selectionMode;
}
public void setSelectionMode(String selectionMode){
selectionMode="multiple";
}
public void onRowSelect(SelectEvent event) {
FacesMessage msg = new FacesMessage("Car Selected: ", ((Car) event.getObject()).getBrand());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public void onRowUnselect(UnselectEvent event) {
FacesMessage msg = new FacesMessage("Car Unselected: ", ((Car) event.getObject()).getBrand());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
@ManagedBean(name=“ECTestScreen”)
@视域
公共类ECTestScreen实现了可序列化{
私有静态最终长serialVersionUID=-855625904411046273L;
私有列表产品=新的ArrayList();
private List rowList=new ArrayList();
私家车列表=新的ArrayList();
私家车选择私家车;
private List selectedCars=new ArrayList();
私有字符串selectionMode=“多个”;
公共列表getRowList(){
返回行列表;
}
公共无效集合行列表(列表行列表){
this.rowList=行列表;
}
公共列表getProducts(){
退货产品;
}
公共产品(列出产品){
这一点。产品=产品;
}
公共列表getCars(){
对于(int j=1;j,我真的不知道为什么要这样区分,因为多重选择数据表也应该包含单一选择的要求
但是如果你坚持的话,我可能会制作两个数据表——一个单一选择和一个多重选择,并让它们“呈现”基于布尔值。selectedCars
必须是一个数组,而不是一个列表。showcase提供了一个列表示例,但它不是这样工作的。这是我共享的独立示例。实际的应用程序在运行时决定选择,而且我们只使用了一个datatable.xhtml,它将用于数百个应用程序creens。它将决定的运行时间取决于某些屏幕xml配置。我需要使其仅在一个datatable动态切换选择时工作。我已观察到rowkey存在问题。但如果我们正在检查动态选择,则不确定如何指定它。