jsf数据表行选择问题

时间:2011-01-26 09:03:21

标签: jsf jsf-2 datatable primefaces

我在Primefaces Datatable中选择行时遇到问题。我使用动态列,因此标准行选择机制在这里不可用,我自己实现复选框选择。

要提供帮助,这是我在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方法,所以我不知道用户选择了哪个复选框。也许我忽略了一些非常微不足道的事情,但找不到解决方案。

有关于此的任何想法吗?如果你帮忙,我会很高兴,或者为动态列提供任何其他行选择解决方案。

提前, 列维

2 个答案:

答案 0 :(得分:1)

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

我知道您提交的是整个表单,并希望获取所有更新的行,在这种情况下,您必须遍历整个List并通过检查Request Handler(Action)中的状态来查找已更新的所有行豆。

希望有所帮助。

答案 1 :(得分:1)

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

<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.
}