在进行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);
}
}
}
Java代码:
//查询组件
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);
}
补充:
这个组件中的查询条件必须是个类,而且还必须有skipRows(分页中的第n条记录)和pageSize(一页的记录数),
可能对有些应用来说有些限制。
可以通过修改
- queryCountMethod.send(_queryCondition);
- queryListMethod.send(_queryCondition);
这两句来实现具体的要求。