【问题标题】:How to update specific inputText in dataTable to be enabled or disabled based on rowSelect event如何根据 rowSelect 事件更新 dataTable 中的特定 inputText 以启用或禁用
【发布时间】:2016-08-16 17:07:41
【问题描述】:

一旦选中行中的复选框,我需要您的帮助来更新要在 dataTable 中启用的特定 inputText 组件。下面是数据表的代码:

<h:form id="request">
      <p:dataTable value="#{dataTableView.employeeList}" id="Employee" var="emp"
                             selection="#{dataTableView.selectedEmployees}" rowKey="#{emp.id}">
      <p:ajax event="rowSelectCheckbox" listener="#{dataTableView.EnableInputText}" />
      <p:ajax event="rowSelect" listener="#{dataTableView.EnableInputText}" />
             <p:columnGroup type="header">
               <p:row>
               <p:column/>
             <p:column headerText="ID"/>
             <p:column headerText="Name"/>
             <p:column headerText="Location"/>
             <p:column headerText="Remarks"/>
               </p:row>
              </p:columnGroup>
           <p:column selectionMode="multiple" style="width:2%;text-align:center"/>
           <p:column headerText="ID">
           <h:outputText value="#{emp.id}"/>
           </p:column>
           <p:column headerText="Name">
           <h:outputText value="#{emp.name}"/>
           </p:column>
           <p:column headerText="Location">
           <h:outputText value="#{emp.location}"/>
           </p:column>
           <p:column headerText="Remarks">
           <h:inputText id="inputT1" value="#{emp.remarks}" disabled="#{emp.disable}"/>
                    </p:column>
                </p:dataTable>
            </h:form>

以及backing bean中的代码:

private List<Student> employeeList = new ArrayList<Student>();
private List<Student> selectedEmployees;
private boolean disable=true;


public void EnableInputText(SelectEvent event) {
    RequestContext context = RequestContext.getCurrentInstance();


    for(int i=0;i<selectedEmployees.size();i++){ 
        for(int j=0;j<employeeList.size();j++){          
        if(selectedEmployees.get(i).getId().equals(employeeList.get(j).getId()))
        {
           selectedEmployees.get(j).setDisable(false);
            context.update("request:Employee:"+i+":inputT1");
           //employeeList.get(j).setDisable(false);
        }
       }
     }
}

目前,我可以点击复选框,但inputText 将保持禁用状态,我会收到错误消息:

java.lang.UnsupportedOperationException

【问题讨论】:

    标签: jsf checkbox jsf-2 primefaces datatable


    【解决方案1】:

    您的问题与 JAVA 相关,而不是 Primefaces。

    问题看起来是 selectedEmployees.get(j).setDisable(false);

    有更多机会获得java.lang.IndexOutOfBoundsException

    只需在事件触发后更新数据表即可。

    <p:ajax event="rowSelectCheckbox"
                                listener="#{dataTableView.EnableInputText}" update="Employee" />
    <p:ajax event="rowSelect"
                                listener="#{dataTableView.onRowSelect}" update="Employee"/>
     <p:ajax event="rowUnselectCheckbox"
                            listener="#{dataTableView.onRowUnselect}" update="Employee"/>
    

    勾选复选框:

    public void EnableInputText(SelectEvent event){
            for (int i = 0;i<selectedEmployees.size();i++) {
                for (int j = 0;j<employeeList.size();j++) {
                    if (selectedEmployees.get(i).getId().equals(employeeList.get(j).getId())) {
                        employeeList.get(j).setDisabled(false);
                    }
                }
            }
        }
    

    行选择:

    public void onRowSelect(SelectEvent selectEvent){
            Employee emp = (Employee)selectEvent.getObject();
    
            for (Employee e : employeeList) {
                if (emp.getId().equals(e.getId())) {
                    e.setDisabled(false);
                }
                else {
                    e.setDisabled(true);
                }
            }
    
        }
    

    取消选中复选框

    public void onRowUnselect(UnselectEvent unselectEvent){
            Employee emp = (Employee)unselectEvent.getObject();
    
            for (Employee e : employeeList) {
                if (emp.getId().equals(e.getId())) {
                    e.setDisabled(true);
                }
            }
        }
    

    输出:

    【讨论】:

    • 感谢您的回答。但是,不幸的是,我只能单击页面中的 1 个复选框,并且 inputText 将被启用。但是,当我尝试再次单击另一个复选框或取消选中选中的复选框时,什么都不会发生,并且页面似乎被冻结了。
    • 它在我的系统中看起来工作正常。你有什么错误吗?
    • 是的复制和粘贴,但问题仍然存在
    • 服务器端有任何日志吗?另外,您能否检查一下您是否有任何登录浏览器(控制台)?
    • 我只使用 System.out.println 在控制台中显示任何错误,但奇怪的是什么都没有打印
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    相关资源
    最近更新 更多