【问题标题】:primefaces datatable selection attribute always populating first row for the first timeprimefaces 数据表选择属性总是第一次填充第一行
【发布时间】:2013-12-29 14:15:42
【问题描述】:
 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。每次新建按钮都会在列表中添加一个空行
它被点击。

现在假设我通过单击新按钮两次添加了两个空行。现在我已经用一些数据填充了两行并检查了第二行复选框/选定的行并单击了保存按钮,它将第二行保存到数据库中。

问题始终是第一行被填充到映射数组中
到数据表的选择属性,并正在保存到数据库中。

假设如果我保持第一行为空并填充第二行并检查/选择第二个
行并尝试保存它,应用程序会抛出错误以输入名称,现在
选择第一行而不是第二行。如果我取消选中/取消选择第一行并且
选择/检查第二行并尝试保存现在一切顺利。

谁能帮我解决这个问题...在此先感谢各位。

【问题讨论】:

    标签: jsf jsf-2 primefaces


    【解决方案1】:

    您应该发布您的支持 bean 和错误消息。
    因为你的页面代码没有问题。

    此外,我不太明白您打算如何处理代码。
    您是否要将数据表用作缓冲区并将所选记录保存到数据库中? 如果是这样,试试这个:

    (页面和你的一模一样)
    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?那不是更复杂吗?对此还有其他担忧吗?

    【讨论】:

    • 非常感谢您的回复,并很抱歉延迟确认。早些时候我没有观察到页面中嵌套表单的使用,因为我不是实际的开发人员(实际上这个页面包含在另一个具有主表单的页面中)。我删除了嵌套表单并删除了不必要的 ajax 调用。现在一切正常。正如你所说,xhtml 很好,因此接受了答案。
    猜你喜欢
    • 2021-09-29
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    相关资源
    最近更新 更多