【问题标题】:get row from rich:datatable binding table从 rich:datatable 绑定表中获取行
【发布时间】:2012-02-18 11:34:37
【问题描述】:

我正在使用 java 6 jsf 1.2 和 richfaces 3.3.3 当我在绑定的 UIDataTable 上调用函数 getRowData

public void priorityChanged(ValueChangeEvent event) {
        Task currentTask = (Task) table.getRowData();

<h:selectOneMenu id="id182_#{rkv}" value="#{dataItem.priority}"
    valueChangeListener="#{customerAdminHandler.priorityChanged}"
    onchange="submit()">
    <f:selectItems value="#{customerAdminHandler.priorityTypes}" />
</h:selectOneMenu>

我在 table.getRowData() 上遇到异常;

java.lang.IllegalArgumentException
    at javax.faces.model.ListDataModel.getRowData(ListDataModel.java:150)
    at org.ajax4jsf.model.SequenceDataModel.getRowData(SequenceDataModel.java:147)
    at org.ajax4jsf.component.UIDataAdaptorBase.getRowData(UIDataAdaptorBase.java:257)

【问题讨论】:

  • &lt;h:selectOneMenu&gt; 在数据表中,对吧?它到底是哪个数据表组件? &lt;rich:dataTable&gt;,对吧?
  • 是的,它是一个rich:dataTable,我的表是一个 UIDataTable;
  • 我敢打赌它是 RichFaces 方面的一些错误。它应该与&lt;h:dataTable&gt; 一起工作得很好。尝试将值更改事件排队到INVOKE_APPLICATION

标签: java jsf datatable richfaces


【解决方案1】:

我用

绕过了这个问题
<f:setPropertyActionListener value="#{dataItem}"
                            target="#{customerProductsHandler.currentApp}" />

而不是绑定表。 相同的代码在干净的环境中为我工作,所以我猜有某种 jar 问题。

无论如何,为了将来参考,我发现以下信息对于使用绑定表很有用

Richfaces 3.3 uses:
org.richfaces.component.html.HtmlDataTable

Richfaces 4  uses:
org.richfaces.component.UIDataTable

jsf1.2  uses:
javax.faces.component.html.HtmlDataTable;

jsf 2  uses:
import javax.faces.model.DataModel;

【讨论】:

    【解决方案2】:

    您是否将rich:dataTable 绑定到托管bean 的组件属性?另外,属性的类型必须是org.richfaces.component.html.HtmlDataTable,至少我们是这样实现了选择数据表的一行(使用@BalusC here的示例代码)。

    jsp代码:

    <script type="text/javascript">
        function dataTableSelectOneRadio(radio) {
            var id = radio.name.substring(radio.name.lastIndexOf(':'));
            var el = radio.form.elements;
            for (var i = 0; i < el.length; i++) {
                if(el[i].name != undefined) {
                    if (el[i].name.substring(el[i].name.lastIndexOf(':')) == id) {
                        el[i].checked = false;
                    }
                }
            }
            radio.checked = true;
        }
    </script>
    <!-- some html/jsp code -->
    <rich:dataTable id="dtDocCartera" style="width:100%"
        binding="#{busquedaDocCartera.hdtCredito}"
        value="#{busquedaDocCartera.lstCredito}" var="credito" rows="15">
        <rich:column>
            <f:facet name="header">
                <h:outputText value="Select" />
            </f:facet>
            <h:selectOneRadio onclick="dataTableSelectOneRadio(this)"
                valueChangeListener="#{busquedaDocCartera.setSelectedItem}">
                <f:selectItem itemValue="null"/>
            </h:selectOneRadio>
        </rich:column>
        <rich:column style="text-align:center">
            <f:facet name="header">
                <h:outputText value="Some Data" />
            </f:facet>
            <h:outputText value="#{credito.data}" />
        </rich:column>
    </rich:dataTable>
    

    这是我们的托管 bean:

    @KeepAlive(ajaxOnly=false)
    public class PBusquedaDocCartera {
        private HtmlDataTable hdtCredito;
        private List<ECredito> lstCredito;
        //This will be the selected data
        private ECredito credito;
        //getters and setters for attributes...
        public void setSelectedItem(ValueChangeEvent event) {
            try {
                credito = (ECredito)hdtCredito.getRowData();
            } catch (Exception objEx) {
                //logging errors...
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-24
      • 2010-10-23
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      相关资源
      最近更新 更多