[英]primefaces datatable selection attribute always populating first row for the first time
Hello Guys,
<h:form id="targetsMenuPanelForm">
<p:commandButton id="cancel" ajax="false" process="@this" value="Cancel"
action="#{myMenuTabsBean.cancel}" styleClass="uta-button button-red" />
<p:commandButton id="save" process="@form" action="#{myMenuTabsBean.save}"
update="@form" value="Save" />
<p:commandButton id="new" action="#{myBackingbean.addEmptyRow}"
process="@this" update="myTable" value="New" />
<p:commandButton id="delete" value="Delete"
action="#{myBackingbean.deleteRow}" process="@form" update="@form" />
<p:dataTable id="myTable" value="#{myBackingbean.myDataModel}"
var="myList" selection="#{myBackingbean.selectedRows}">
<p:column selectionMode="multiple" id="select" />
<p:column id="namecol" headerText="Name">
<p:inputText id="name" value="#{myList.targetName}" />
</p:column>
<p:column id="typecol" headerText="Type">
<p:selectOneMenu id="types" value="#{myList.type}">
<f:selectItem itemLabel="Direct Dial" itemValue="DirectDial" />
<f:selectItem itemLabel="Private Wire" itemValue="PrivateWire" />
</p:selectOneMenu>
</p:column>
</p:dataTable>
</h:form>
上面的代碼是我的Xhtml。 新建按鈕每次都會在列表中添加一個空行
單擊它。
現在假設我通過單擊兩次新按鈕添加了兩個空行。 現在,我在兩行中填充了一些數據,並選中了第二行復選框/選定的行,然后單擊“保存”按鈕,將第二行保存到db中。
問題總是第一行被填充到映射的數組中
到數據表的選擇屬性,並保存到db中。
假設如果我將第一行留空並填充第二行並檢查/選擇第二個
行並嘗試將其保存,應用程序將拋出錯誤以輸入名稱,現在
選擇第一行而不選擇第二行。 如果我取消選中/取消選擇第一行,
選擇/選中第二行,然后嘗試保存所有內容,一切順利。
任何人都可以幫助我解決這個問題嗎?謝謝大家。
您應該發布支持bean和錯誤消息。
因為您的頁面代碼沒問題。
而且,我還不太了解您打算如何使用該代碼。
您是否要使用dataTable作為緩沖區並將所選記錄保存到DB中? 如果是這樣,請嘗試以下操作:
(頁面與您的頁面完全相同)
myBackingbean.java :
private DataModel myDataModel;
private List<myData> temp=new ArrayList<>();
private myData[] selectedRows=new myData[100];
private int count=0;
@PostConstruct
public void init(){
temp=new ArrayList<>();
count=0;
myDataModel=new DataModel();
}
public void addEmptyRow(){
temp.add(new myData("targetName"+count,"type"+count++));
myDataModel=new DataModel(temp);
}
public void deleteRow(){
for(myData m:selectedRows){
temp.remove(m);
}
myDataModel=new DataModel(temp);
}
//getters and setters below...
myMenuTabsBean.java :
private List<myData> savedData = new ArrayList<>();
public void cancel() {
myBackingbean myBean = (myBackingbean) FacesContext.getCurrentInstance().getELContext().getELResolver().getValue(FacesContext.getCurrentInstance().getELContext(), null, "myBackingbean");
DataModel myData = new DataModel();
myBean.setMyDataModel(myData);
myBean.init();
}
public void save() {
myBackingbean myBean = (myBackingbean) FacesContext.getCurrentInstance().getELContext().getELResolver().getValue(FacesContext.getCurrentInstance().getELContext(), null, "myBackingbean");
myData[] my = myBean.getSelectedRows();
for (myData m : my) {
savedData.add(m); //Add to List instead of DB for simplicity.
}
printSavedData();
cancel();
}
public void printSavedData() { //print saved data to see if the data is saved.
for (int i = 0; i < savedData.size(); i++) {
System.out.println(savedData.get(i).getTargetName() + ":" + savedData.get(i).getType());
}
}
最后,為什么要在myMenuTabsBean
而不是myBackingbean
編寫save()
和cancel()
? 這不是更復雜嗎? 還有其他問題嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.