繁体   English   中英

primefaces数据表选择属性始终总是第一次填充第一行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM