【问题标题】:Select Row in primefaces data table在 primefaces 数据表中选择行
【发布时间】:2015-07-10 01:02:46
【问题描述】:

我有这张桌子:

<h:form>
    <p:dataTable id="books" value="#{ordersBean.userOrders}" var="book" selection="#{ordersBean.selectedBook}">
        <p:column>
            <f:facet name="header">Order ID</f:facet>
            <h:outputText value="#{book[0]}"/>
        </p:column>
        <p:column>
            <f:facet name="header">Title</f:facet>
            <h:outputText value="#{book[1]}"/>
        </p:column>
        <p:column>
            <f:facet name="header"></f:facet>
            <p:commandButton id="selectRowBtn" value="select" action="#{ordersBean.showSelectedBook}"/>
        </p:column>
    </p:dataTable>
</h:form>

我希望当我单击每个select 按钮时,它是分配给selectedBook 属性的行信息并在showSelectedBook() 方法中显示:

这里是ordersBean

private Book selectedBook = new Book();

public Book getSelectedBook() {
    return selectedBook;
}

public void setSelectedBook(Book selectedBook) {
    this.selectedBook = selectedBook;
}

public void showSelectedBook() {
    System.out.println("In selected Book(), book: " + getSelectedBook());
}

但结果是这样的:

In selected Book(), book: null

【问题讨论】:

  • 行不能这样选择。您需要使用singlemultiple 两个值之一适当地设置selectionMode。看看showcase
  • @Tiny 但我不需要在对话框中显示选定的行,我需要在 backing bean 中获取行。
  • 展示示例上的对话框只是一个演示。对话框中显示的行来自在相应数据表中选择的相关托管行 - &lt;ui:repeat value="#{dtSelectionView.selectedCars}" var="car"&gt; 在多行选择的情况下,#{dtSelectionView.selectedCar} 在单行选择的情况下。如果根本不需要,可以简单地忽略该对话框。
  • 链接的展示展示了多种方法来获取支持 bean 中的行。第三个示例 eventsDT 可能是最直接的示例。
  • 点击按钮获取 actionListener 中的 bookId,迭代 bookList 并在成功匹配时提取 Book 对象,将其分配给 selectedBook。很简单!!!

标签: java jsf primefaces datatable


【解决方案1】:

应该是这样的:

XML 代码:

<p:commandButton id="selectRowBtn" value="select" 
    action="#{ordersBean.showSelectedBook}">
    <f:param name="bookId" value="#{book[0]}" />
</p:commandButton>

Java bean 方法:

public void showSelectedBook() {

    Map<String,String> params = 
        FacesContext.getExternalContext().getRequestParameterMap();

    int bookId = Integer.valueOf(params.get("bookId"));

    for(Book book : bookList){
        if(book.bookId == bookId){
            selectedBook = book;
            break;
        }
    }

    System.out.println("In selected Book(), book: " + getSelectedBook());
}

此外,您必须了解将参数发送到操作的模式,请参阅下面的链接。 http://www.mkyong.com/jsf2/4-ways-to-pass-parameter-from-jsf-page-to-backing-bean/

【讨论】:

    【解决方案2】:

    如果要显示所选书籍,则必须设置selectionMode="single",并且无需在每一行中放置commandButton,只需在页脚方面仅指定一个commandButton,如下所示:

    <f:facet name="footer">
            <p:commandButton id="selectRowBtn" value="select" action="#{ordersBean.showSelectedBook}"/>
        </f:facet>
    

    而您的主要问题是您将 new Book() 设置为您的 selectedBook 变量,因此将 null 值设置为您的 selectedBook ,此声明:

    private Book selectedBook = new Book();
    

    应该是:

    private Book selectedBook;
    

    您不必在 selectedBook 中实例化 new Book()

    看看Showcase 中的第二个示例,看看它是如何工作的。

    【讨论】:

      【解决方案3】:

      更好的解决方案并且没有选择按钮:

      Xml 代码:

      <p:dataTable id="ListBook"
          value="#{ordersBean.bookList}"
          selection="#{ordersBean.selectedBook}" var="book"
          rowKey="#{book.id}" selectionMode="single">
      
          <p:ajax event="rowSelect"
              listener="#{ordersBean.onRowSelectDataTable()}"
                                          update="ListBook" />
        ..... <columns> ..
      </p:datatable>
      

      Java 豆:

      private Book selectedBook=new Book();
      private boolean headerButtonsDisabled=true;
      //add a List object for all books (bookList) with getter and setter
      
      
      public boolean isHeaderButtonsDisabled() {
              return headerButtonsDisabled;
          }
      
      public void setHeaderButtonsDisabled(boolean headerButtonsDisabled) {
          this.headerButtonsDisabled = headerButtonsDisabled;
      }
      
      public void onRowSelectDataTable() {
          this.setHeaderButtonsDisabled(false);
      }
      
      public Book getSelectedBook() {
              return selectedBook;
          }
      
      public void setSelectedBook(Book selectedBook) {
          this.selectedBook = selectedBook;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-09
        • 2013-05-24
        • 2014-03-19
        • 1970-01-01
        • 2013-05-31
        • 1970-01-01
        • 2017-10-02
        相关资源
        最近更新 更多