一种动态行数目的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的标识部分。
效果:
但有时,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) 编辑 收藏 举报