我在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方法,所以我不知道用户选择了哪个复选框。也许我忽略了一些非常微不足道的事情,但找不到解决方案。
有关于此的任何想法吗?如果你帮忙,我会很高兴,或者为动态列提供任何其他行选择解决方案。
提前, 列维
答案 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.
}