【问题标题】:jsf datatable row selection problemjsf数据表行选择问题
【发布时间】:2011-06-15 17:20:43
【问题描述】:

我在选择 Primefaces 数据表中的行时遇到问题。我使用的是动态列,所以这里标准的行选择机制不可用,我自己实现了复选框选择。

为了提供帮助,这是我在 xhtml 中的简化版本:

<h:form>
  <p:dataTable id="table"
               var="result"
               value="#{tableBean.results}">

    <p:columns value="#{tableBean.columnNames}" var="column" columnIndexVar="colIndex">
      <f:facet name="header">
        #{column}
      </f:facet>

      <h:panelGroup rendered="#{colIndex==0}">
        <h:outputLabel>#{rowIndex}</h:outputLabel>
        <h:selectBooleanCheckbox value="#{tableBean.selectedRows[result[0]]}"/>
      </h:panelGroup>
    </p:columns>
  </p:dataTable>
  <h:commandButton value="Submit"></h:commandButton>
</h:form>

这是我在托管 bean 中选择复选框的内容:

package testpackage;

import java.util.*;
import javax.faces.bean.*;

@ManagedBean
@SessionScoped
public class TableBean
{

  private Map<String, Boolean> selectedRows = new HashMap<String, Boolean>();
  List<List<String>> results = new LinkedList<List<String>>();

  public TableBean()
  {
    List<String> row1 = new LinkedList<String>();
    List<String> row2 = new LinkedList<String>();
    row1.add("row1.ref");
    row1.add("row1.id");
    row1.add("row1.status");
    row2.add("row2.ref");
    row2.add("row2.id");
    row2.add("row2.status");
    results.add(row1);
    results.add(row2);

    //selectedRows.put("row2.ref", true);
  }

  public Map<String, Boolean> getSelectedRows()
  {
    return selectedRows;
  }

  public String submit()
  {
    List<List<String>> selectedResults = new ArrayList<List<String>>();
    for (List<String> result : results)
    {
      if (selectedRows.get(result.get(0)) != null)
      {
        selectedResults.add(result);
        selectedRows.remove(result.get(0));
      }
    }

    return null;
  }

  public List<List<String>> getResults()
  {
    return results;
  }

  public List<String> getColumnNames()
  {
    List<String> columnNames = new LinkedList<String>();
    columnNames.add("");
    columnNames.add("REF");
    columnNames.add("ID");
    columnNames.add("STATUS");
    return columnNames;
  }
}

getSelectedRows 方法效果很好,但问题是 setSelectedRows 方法从未被调用,所以我不知道用户选择了哪些复选框。也许我忽略了一些非常琐碎的事情,但找不到解决方案。

对此有什么想法吗?如果您能提供帮助或为动态列提供任何其他行选择解决方案,我将非常高兴。

提前谢谢, 列维

【问题讨论】:

    标签: jsf jsf-2 datatable primefaces


    【解决方案1】:

    在我看来,您在 selectBooleanCheckBox 中呈现了错误的字段。
    您应该使用来自 result 变量的变量或字段。
    我的解决方案:
    在您的情况下,您将 List 中的对象呈现为表格行的一种形式,因此如果您想进行一些更改并检索该行的状态,那么您应该只使用该对象中的变量。

    我了解您正在提交整个表单并希望获取所有更新的行,在这种情况下,您必须遍历整个列表并通过检查请求处理程序(操作)中的状态来查找所有已更新的行豆子。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      从不为嵌套对象调用 setter。您是负责创建它们的人,而不是 JSF。 JSF 只是获取嵌套对象,然后在其上调用 setter(在 Map 的情况下是 put() 方法)。您只需要确定 action 方法中的选定行。为命令按钮添加动作方法:

      <h:commandButton value="Submit" action="#{bean.submit}"></h:commandButton>
      

      定义如下(猜测/假设var="result"本质上是Object[]):

      public String submit() {
          List<Object[]> selectedResults = new ArrayList<Object[]>();
          for (Object[] result : results) {
              if (selectedRows.get((String) result[0])) {
                  selectedResults.add(result);
                  selectedRows.remove(result[0]); // Reset.
              }
          }
      
          // Now selectedResults contains all selected results.
      }
      

      【讨论】:

      • 我尝试了您的解决方案,但在调用函数时 selectedRows 仍未填充新值。他们什么时候应该被选中的复选框填满?
      • 在更新模型值阶段。您自己说过getSelectedRows() 效果很好。为确保,它是否在 动作方法之前被调用? (submit() 方法)。
      • 是的,调用了getSelectedRows(),但没有调用setSelectedRows(),所以selectedRows Map没有填充
      • 再一次,setter 永远不会为嵌套对象调用。所有 JSF 基本上对每个项目所做的都是tableBean.getSelectedRows().put(result[0], trueOrFalse)。在 getter 中添加一个记录器或一些 System.out.println(selectedRows),您会看到它的内容在表单提交的更新模型值阶段的每次 get 调用中都会增长。如果没有,那么问题很可能是表单提交的请求中没有保留数据模型。这是一个完全不同的问题。
      • 我明白你的意思,但对我来说 tableBean.getSelectedRows().put() 永远不会被调用。我在 getSelectedRows 方法中设置了一个断点,这就是我所看到的:这是顺序: 1. 加载页面 -> 每行调用一次 getter 2. 我手动选中/取消选中复选框。 3.我按下提交按钮->不调用getter,只调用提交4.页面重新加载(步骤1)
      猜你喜欢
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多