本组件需要"Flex翻页控件 ",我的另一篇文章有这个组件的详细代码 http://lj-zhu.iteye.com/admin/blogs/720582 .
在进行flex编程时,经常会用到在dataGrid中分布显示数据,但是在每个页面中都写一遍查询,显示,控制翻页的代码,既烦琐,又不美观,于是我就写一个比较通用的查询组件。
代码CommonQueryComponent.as:
package cn.zlj.component { import mx.collections.ArrayCollection; import mx.controls.DataGrid; import mx.rpc.events.ResultEvent; import mx.rpc.remoting.mxml.Operation; import mx.rpc.remoting.mxml.RemoteObject; import cn.zlj.event.MyEvent; /** * 通用翻页组件 */ public class CommonQueryComponent { private var _remoteObject:RemoteObject; //远程对象 private var _queryCondition:Object; //查询条件 private var _pager:FlexPager; //分页控件 private var _dg:DataGrid; //数据显示控件 private var queryCountMethod:Operation; //查询记录数的方法 private var queryListMethod:Operation; //查询列表的方法 //查询记录数的方法名 public function set queryCountOperation(queryCountMethodName:String):void { queryCountMethod=Operation(_remoteObject.getOperation(queryCountMethodName)); queryCountMethod.addEventListener(ResultEvent.RESULT, countResultHandler); } //查询列表的方法名 public function set queryListOperation(queryListOperationName:String):void { queryListMethod=Operation(_remoteObject.getOperation(queryListOperationName)); queryListMethod.addEventListener(ResultEvent.RESULT, listResultHandler); } //list容器 public function set dataContainer(dg:DataGrid):void { _dg=dg; //BindingUtils.bindProperty() //动态绑定 } //list容器 public function set flexPager(pager:FlexPager):void { _pager=pager; _pager.addEventListener(MyEvent.PAGE_CHANGED, pageChangedHandler); } //构造函数 public function CommonQueryComponent(remoteObject:RemoteObject) { //调用后台java的对象 _remoteObject=remoteObject } //处理查询记录数返回的结果 private function countResultHandler(event:ResultEvent):void { var count:int=int(event.result); _pager.recordCount=count; if (count > 0) { //查询member数据 queryList(_pager.pageSize, 0); } else { var dgProvider:ArrayCollection=ArrayCollection(_dg.dataProvider); //清空数据 if (dgProvider != null) { (_dg.dataProvider as ArrayCollection).removeAll(); } } } //处理查询记录列表返回的结果 private function listResultHandler(event:ResultEvent):void { _pager.enabled=true; _dg.dataProvider=ArrayCollection(event.result); } //查询 public function query(queryCondition:Object):void { if (queryCondition == null) { return; } _pager.enabled=false; _queryCondition=queryCondition; queryCountMethod.send(_queryCondition); } //查询列表 public function queryList(pageSize:int, rowFrom:int):void { //翻页skipRows _queryCondition.skipRows=rowFrom; //一页最大记录数 _queryCondition.rowRecords=pageSize; _pager.enabled=false; queryListMethod.send(_queryCondition); } //翻页处理 private function pageChangedHandler(event:MyEvent):void { if(_queryCondition == null) { return; } var skipRows:int=event.eventData.rowFrom var pageSize:int=event.eventData.pageSize queryList(pageSize, skipRows); } } }
使用方法也是很简单的:
//查询组件
private var queryer:CommonQueryComponent;
//module的creationComplete事件
private function init():void
{
//查询组件
//queryLogic:RemoteObject,用来调用后台查询
queryer=new CommonQueryComponent(queryLogic);
//显示数据的dataGrid
queryer.dataContainer=dg1;
//页面组件
queryer.flexPager=pager;
//后台java类中查询总计录数的方法的名字
queryer.queryCountOperation="queryConut";
//后台java类中查询一页数据的方法的名字
queryer.queryListOperation="queryList";
}
//根据条件查询
private function query():void
{
//得到查询条件
condition=getQueryCondition();
//查询
queryer.query(condition);
}
一切OK。
补充:
这个组件中的查询条件必须是个类,而且还必须有skipRows(分页中的第n条记录)和pageSize(一页的记录数),
可能对有些应用来说有些限制。
可以通过修改
queryCountMethod.send(_queryCondition);
queryListMethod.send(_queryCondition);
这两句来实现具体的要求。