2014-09-09 3 views
2

То, что я пытаюсь сделать, это сделать что-то в первой строке, второй строке и т. Д. Таблицы.<c:when> не работает в PrimeFaces datatable?

<p:panel header="#{mat.description}"> 
    <p:dataTable var="datarow" value="#{myBean.getDatarows(mat.itemId)}" emptyMessage="No materials" rowIndexVar="row"> 
     <c:choose> 
      <c:when test="${row eq 0}"> 
       <p:column headerText=""><h:outputText value="#{datarow.get(1)}" /></p:column> 
      </c:when> 
      <c:when test="${row eq 1}"> 
       <p:column headerText=""><h:outputText value="#{datarow.get(1)}" /></p:column> 
      </c:when> 
     </c:choose> 
     <p:column headerText=""><h:outputText value="#{datarow.get(6)}" /></p:column> 
     <p:column headerText="Month 1"><h:outputText value="#{datarow.get(1)}" /></p:column> 
     <p:column headerText="Month 3"><h:outputText value="#{datarow.get(2)}" /></p:column> 
     <p:column headerText="Month4"><h:outputText value="#{datarow.get(3)}" /></p:column> 
     <p:column headerText="Month 5"><h:outputText value="#{datarow.get(4)}" /></p:column> 
     <p:column headerText="Month6"><h:outputText value="#{datarow.get(5)}" /></p:column> 
    </p:dataTable> 
</p:panel> 

Но c: выберите и c: когда ничего не отображается. Я неправильно делаю тест на номер строки?

+0

http://www.stackoverflow.com/questions/3342984/jstl-in-jsf2-facelets-makes-sense – BalusC

ответ

3

Это плохая конструкция и не будет работать таким образом. Вы неправильно смешиваете теги JSTL и JSF.

Теги JSTL c:choose и c:when оцениваются во время дерева, но тег p:dataTable при визуализации дерева пользовательского интерфейса.

Вместо этого используйте rendered -трибут на p:column, если вы хотите включить/исключить полные столбцы вашего типа данных. Если вы хотите достичь различного поведения, что неоспоримым отображаются внутри столбцов, можно, например, использовать ? -оператора решить, что неоспоримый вынесено:

<p:dataTable var="datarow" ... rowIndexVar="row"> 
    <p:column> 
     <h:outputText value="#{row eq 0 ? datarow.get(1) : 'some other stuff'}"/> 
    </p:column> 
</p:dataTable> 

Оказывать различные виды элементов внутри колонки, просто положить их обоих внутри колонны, но с разными rendered атрибута по:

<p:column> 
     <h:outputText rendered="#{row != 4}"/> 
     <p:inputText rendered="#{row eq 4}"/> 
</p:column> 

Это сделает вход-элемент в 5-й строке (rowIndexVar является 0 на основе), и выходной элемент во всех других строках.

+0

Спасибо. Я вижу, что я не делал этого правильно, но мое фактическое намерение состояло в том, чтобы позволить ему быть редактируемым текстовым полем только в одной строке и выводить текст на другие. Как я могу это сделать? – octopish

+0

@pern Я отредактировал свой ответ в соответствии с вашим дополнительным вопросом в вашем комментарии. – stg

+0

Отлично! Благодаря! – octopish

0

Я считаю, что вам всегда нужно одинаковое количество столбцов.

Изменить код:

<c:when test="${row eq 0}"> 
    <p:column headerText=""><h:outputText value="#{datarow.get(1)}" /></p:column> 
</c:when> 
<c:when test="${row ne 0}"> 
    <p:column headerText=""><h:outputText value="#{datarow.get(1)}" /></p:column> 
</c:when> 

Таким образом, вы все еще есть столбец, когда не в первом или втором ряду.

+0

Спасибо! Это работает, но что, если я хочу больше двух строк? – octopish

+0

Тогда вы должны добавить больше, когда тестовые примеры ... но вы всегда должны иметь соответствие. – Yamada

+1

Это концептуально неправильно и не будет работать, вы просто этого не заметите, потому что вы делаете одинаковый контент в каждом случае. См. Мой ответ ниже для более подробной информации. – stg

Смежные вопросы