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中。
问题始终是第一行被填充到映射的数组中 到数据表的selection属性并保存到db。
假设我保持第一行为空并填充第二行并检查/选择第二行
行并尝试保存它,应用程序抛出错误输入名称,现在是
选择第一行而不是第二行。如果我取消选中/取消选择第一行和
选择/检查第二行并尝试保存每件事情顺利进行。
任何人都可以帮我解决这个问题......先谢谢你们。
答案 0 :(得分:1)
您应该发布您的支持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());
}
}
最后,为什么要在save()
而不是cancel()
中写myMenuTabsBean
和myBackingbean
?那不是更复杂吗?还有其他问题吗?