jsf数据表行选择问题

发布于 2024-10-14 22:03:15 字数 2504 浏览 2 评论 0原文

我在 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 方法从未被调用,所以我不这样做不知道用户选择了哪些复选框。也许我忽略了一些非常琐碎的事情,但找不到解决方案。

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

提前谢谢, 列维

I have a problem with selecting rows in the Primefaces Datatable. I use dynamic columns, so the standard row selection mechanism is not usable here, I implement checkbox selection myself.

To help, here's s simplified version of what I have in my 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>

And here's what I have in the managed bean to select the checkboxes:

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

The getSelectedRows method works great, but the problem is that the setSelectedRows method is never called, so I don't know which checkboxes the user has selected. Maybe I overlook something very trivial, but cannot find the solution.

Any ideas on this? I would be very glad if you helped, or give any other row selection solution for the dynamic columns.

Thx in advance,
Levi

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寂寞美少年 2024-10-21 22:03:15

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

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

希望有帮助。

To me it looks you are rendering the wrong field in selectBooleanCheckBox.
You should be using variable or field from the result variable.
My solution:
In your situation you are rendering an object from List as a form of table row so if you want to make some changes and retrieve the status of that row then you should be using the variable from that object only.

I understand you are submitting the whole form and want to pickup all updated rows, in that case you will have to loop through the whole List and find all the rows which have been updated by checking the status in Request Handler(Action) bean.

Hope that helps.

青芜 2024-10-21 22:03:15

嵌套对象永远不会调用 setter。您是负责创建它们的人,而不是 JSF。 JSF 只是获取嵌套对象,然后调用它的 setter(对于 Map 来说是 put() 方法)。您只需在操作方法中确定选定的行即可。向 commandbutton 添加一个操作方法:

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

The setter is never called for nested objects. You're the one who's responsible for creating them, not JSF. JSF just gets the nested object and then calls the setter on it (which is the put() method in case of a Map). You just need to determine the selected rows in the action method. Add an action method to the commandbutton:

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

which is definied like follows (guessing/assuming that var="result" is in essence an 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.
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文