2013-12-11 44 views
0
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。新按鈕每次在列表中添加一個空行
單擊它。primefaces數據表選擇屬性總是首次填充第一行

現在假設我通過兩次單擊新按鈕添加了兩個空行。現在我已經用一些數據填充了兩行,並檢查了第二行復選框/選定行,並單擊了保存按鈕,將第二行保存到數據庫中。

問題始終是第一行正在填充到數組映射的
到數據表的選擇屬性,並被保存到數據庫中。

假設如果我保持第一行空和填充第二行和檢查/選擇第二
行並嘗試將其保存,應用程序引發錯誤輸入姓名和現在
第一行被選中而不是第二行。如果我取消/取消選擇第一行和
選擇/檢查第二行,並嘗試保存每一件事情順利現在。

任何人都可以幫我解決這個問題...先謝謝你們。

回答

1

你應該發佈你的支持bean和錯誤消息。
因爲你的頁面代碼沒有問題。

更重要的是,我不太清楚你打算如何處理代碼。
你打算使用dataTable作爲緩衝區並將選中的記錄保存到數據庫中嗎? 如果是的話,試試這個:

(頁是準確和你的一樣)
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中寫save()cancel()myBackingbean?這不是更復雜嗎?還有其他的關注嗎?

+0

非常感謝您的回覆,並對延遲承認抱歉抱歉。之前我沒有觀察到頁面中嵌套窗體的用法,因爲我不是實際的開發人員(實際上這個頁面被包含在另一個具有主窗體的頁面中)。我已經刪除了嵌套窗體並刪除了不必要的ajax調用。現在每件事情都很好。正如你所說的,xhtml很好,因此接受了答案。 –

+0

很高興看到您的問題解決。 – nosnhoj

相關問題