2011-01-26 3 views
1

У меня проблема с выбором строк в файле Primfaces Datatable. Я использую динамические столбцы, поэтому стандартный механизм выбора строк не используется здесь, я сам реализую выбор флажка.jsf datatable row selection problem

Чтобы помочь, вот S упрощенного варианта того, что у меня в 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> 

А вот то, что я имею в управляемом компоненте, чтобы выбрать флажки:

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 никогда не вызывается, поэтому я не знаю, какие флажки выбраны пользователем. Возможно, я пропускаю что-то очень тривиальное, но не могу найти решение.

Любые идеи по этому вопросу? Я был бы очень рад, если бы вы помогли или предложили любое другое решение выбора строк для динамических столбцов.

Thx заранее, Леви

ответ

1

Для меня это выглядит вы рендеринга неправильное поле в selectBooleanCheckBox.
Вы должны использовать переменную или поле из переменной result.
Мое решение:
В вашей ситуации вы представляете объект из списка как форму строки таблицы, поэтому, если вы хотите внести некоторые изменения и получить статус этой строки, тогда вы должны использовать переменную из этого объекта только.

Я понимаю, что вы отправляете всю форму и хотите выбрать все обновленные строки, в этом случае вам придется перебирать весь список и находить все строки, которые были обновлены, проверяя статус в обработчике запросов (действие) bean.

Надеюсь, что это поможет.

1

Сеттер никогда не вызывается для вложенных объектов. Вы тот, кто отвечает за их создание, а не за JSF. JSF просто получает вложенный объект, а затем вызывает на нем установщик (который является методом put() в случае Map). Вам просто нужно определить выбранные строки в методе действий. Добавить метод действия в 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. 
} 
+0

Я попробовал ваше решение, но selectedRows еще Безразлично» t заполняется новыми значениями к моменту вызова функции. Когда они должны заполняться выбранными флажками? – Levi

+0

Во время обновления модели значения фазы. Вы сами сказали, что 'getSelectedRows()' отлично работает. Чтобы убедиться, что это называется * до * метода действия? (метод 'submit()'). – BalusC

+0

Да, вызывается getSelectedRows(), но не setSelectedRows(), поэтому выбранная карта Rows не заполнена. – Levi