Tao & Zen

Soli Deo Gloria!

导航

一种动态行数目的datetable的提交--基于jsf(sun 1.101)

有的时候业务表单中,datatable用来作为form来传大量规格参数是很适合的。
但有时,datatable中行的数目是事先不确定的,这样就对于jsf这种组件式的,基于manage bean
的难度增加了许多。

典型的方案是:针对datatable的动态行部分用另一个页面来添加
即,加一个button,作为导航到另一个页面,这个里面就可以初始化一个针对datatable行的bean
这样就可以自己控制datatable中的行数了。

我这有个方案,利用 值变更事件,来取得应该有的行的数目,触发事件动态添加行bean。
里面有几点要注意:
       1.             <h:selectOneMenu value="#{backing_contractB.tailNumber}"
                        immediate="true" valueChangeListener="#{backing_contractB.addDe}"
                          onchange="this.form.submit()">
                        <f:selectItem itemLabel="0" itemValue="0"/>
                        <f:selectItem itemLabel="1" itemValue="1"/>
                        <f:selectItem itemLabel="2" itemValue="2"/>
                        <f:selectItem itemLabel="3" itemValue="3"/>
                        <f:selectItem itemLabel="4" itemValue="4"/>
                        <f:selectItem itemLabel="5" itemValue="5"/>
                    </h:selectOneMenu>

       这里是动态菜单的部分,触发值变更事件, immediate="true"必须的,这里也可以采用inputtext。

        2。    private List detailList = new ArrayList<ContractDe>(7);
   
                public void addDe(ValueChangeEvent vce) {
                int n= Integer.parseInt(vce.getNewValue().toString());
                 for(int i =0;i<n;i++) {
                  ContractDe cd = new ContractDe();
                 cd.setBiaodi(Integer.toString(i));
                  this.detailList.add(cd);
                        }

        if (n ==0){
            detail.setRows(0);
        }
        this.detail.setRows(n);
        FacesContext context = FacesContext.getCurrentInstance();
        context.renderResponse();

      }
    }
这里面是动态加行bean的地方,最后两句一定要加,可以帮助你正确的赋值,跳过一些验证。

datatable 中的value就是最上的detailList

这个bean要加成session,否则赋值会失效。或把这个bean 写到context里面去,以保存值。
或者定义一个额外的保存值的变量压到session map中,然后在这个bean初始化时取到也可,最方便
的还是改生存期。

<h:dataTable binding="#{backing_contractB.detail}"
                     value="#{backing_contractB.detailList}" id="detail" width="90%"
                    rows="5" var="row" rowClasses="list-row-odd"
                    headerClass="table-header" rendered="true" >
这个datatable的标识部分。

效果:


posted on 2007-07-06 15:59  康国庆--thinkinlove  阅读(1245)  评论(0编辑  收藏  举报