`
Lianzhong.Huang
  • 浏览: 10806 次
  • 性别: Icon_minigender_1
  • 来自: 云南
最近访客 更多访客>>
社区版块
存档分类
最新评论

Flex自定义控件——Pagebar分页控件

    博客分类:
  • Flex
阅读更多

       开发时经常遇到用一个DataGrid分页显示数据的情况,然而Flex本身没有提供分页控件,给开发带来了不便。这里将自己开发时做的一个分页控件摆出来供刚入门的朋友参考。O(∩_∩)O~

 

 

 

采用BlazeDS与Java端通信

 

1. 一个Vo对象Page存放分页信息,以及相对应的Java端的Page对象

2. 一个很简单的自定义事件PageEvent

3. 调用。通过RemoteObject调用服务器的分页查询方法(返回值为Page对象)

 

 

一、JAVA端 

 

1、Page对象  (从SpringSide那借来的)

/**
 * 分页对象. 包含当前页数据及分页信息如总记录数.
 */
public class Page {
/**
* 默认每页记录数
*/
private static final int DEFAULT_PAGE_SIZE = 20;


/**
* 每页的记录数
*/
private int pageSize = DEFAULT_PAGE_SIZE; 

/**
* 当前页第一条数据在List中的位置,从0开始
*/
private long start = 0; 
 
/**
* 总记录数
*/
private long totalCount = 0; 

/**
* 总页数
*/
@SuppressWarnings("unused")
private long totalPageCount = 0;
 

/**
* 当前页数
*/
@SuppressWarnings("unused")
private long currentPageNo;

/**
* 查询结果
*/
private List resultList;
}

  

 

2、查询方法接口

/**
* 分页查询
* @param condition 查询条件 (根据需求来定)
* @param pageNo
* @param pageSize
* @return
*/
public Page pagedQuery(String condition, int pageNo, int pageSize);

 

  

二、Flex端 

 

1、Page对象(通过工具类生成)

package lzh.demo.pagebar.model {
import mx.collections.ArrayCollection;
[RemoteClass(alias="lzh.demo.pagebar.model.Page")]
[Bindable]
public class Page {
/**
* 默认每页记录数
*/
public static const DEFAULT_PAGE_SIZE:int = 20;
/**
* 每页的记录数
*/ 
public var pageSize:int = DEFAULT_PAGE_SIZE; 
/**
* 当前页第一条数据在List中的位置,从0开始
*/ 
public var start:int;
/**
* 总记录数
*/ 
public var totalCount:int; 
/**
* 总页数
*/ 
public var totalPageCount:int; 
/**
* 当前页数
*/ 
public var currentPageNo:int = 1; 
/**
* 查询结果
*/  
public var resultList:ArrayCollection;
public function Page() {
}
public static function buildPage(item:Object) :  Page{
if(null==item) return null;
var page:Page = new Page();
page.pageSize = item.pageSize;
page.start = item.start;
page.data = item.data;
page.totalCount = item.totalCount;
page.totalPageCount = item.totalPageCount;
page.currentPageNo = item.currentPageNo;
page.resultList = item.resultList;
return page;
}
}
} 

 

 

2、PageEvent

package lzh.demo.pagebar.event {
import flash.events.Event;
import lzh.demo.pagebar.model.Page;
public class PageEvent extends Event {
public var page:Page;
public function PageEvent(page:Page, type:String) {
super(type);
this.page = page;
}
public override function clone():Event{
return new PageEvent(page, type);
}
}
}

  

 

3、PageBar

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"
verticalAlign="bottom"
creationComplete="init()" horizontalGap="4">
<mx:Metadata>
	[Event(name="goPage",type="lzh.demo.pagebar.event.PageEvent")]
</mx:Metadata>
<mx:Script>
<![CDATA[
import lzh.demo.pagebar.event.PageEvent;
import lzh.demo.pagebar.model.Page;
import mx.events.ListEvent;
import mx.events.NumericStepperEvent;
private var _page:Page;
[Bindable]
public function set page(page:Page):void{
_page = page; 
configPageBar();
}
public function get page():Page{
	return _page; 
}
[Bindable]
/**
* 在HorizontalList中显示的页码
*/ 
public var pageNumbers:Array=[];
/**
* HorizontalList中显示的最大数字
*/ 
private static const SIZE:int = 10; 
/**
* HorizontalList左边显示的数量
*/ 
private static const LEFT_SIZE:int = 2; 
private function init():void{
if(null==_page) {
	_page = new Page();
}
configPageBar();
}
/**
* 配置PageBar
*/ 
private function configPageBar():void{
configPageNumbers();
hbFirst.addChild(lbtnFirst);
hbPrev.addChild(btnPrev);
hbNext.addChild(btnNext);
hbLast.addChild(lbtnLast);
// 左边的显示:首页\上一页
if (1==_page.currentPageNo){
	hbFirst.removeChild(lbtnFirst);
	hbPrev.removeChild(btnPrev);
} else if((1<_page.currentPageNo) && (_page.currentPageNo<=4)){
	hbFirst.removeChild(lbtnFirst);
}
// 右边的显示:下一页\尾页
if (_page.totalPageCount<=_page.currentPageNo){
	hbLast.removeChild(lbtnLast);
	hbNext.removeChild(btnNext);
} else if(pageNumbers.indexOf(_page.totalPageCount)>-1){
	hbLast.removeChild(lbtnLast);
}
hListNumbers.columnCount = pageNumbers.length;
} 
/**
* 配置显示的可选页码
*/  
private function configPageNumbers():void{
pageNumbers = [];
if (_page.totalPageCount<1){ // 总页数为0
	return;
}
var i:int=0;
if (_page.currentPageNo<4 ){
for(i=1; i<=_page.currentPageNo; i++){ //将<=currentPageNo的页码加入
pageNumbers.push(i);
}
} else {
for(i=LEFT_SIZE; i>=0; i--){ 
	pageNumbers.push(_page.currentPageNo-i);
}
}
// 从currentPage后起,分别加入,总数不超过10
for(i=1; pageNumbers.length<SIZE && (_page.currentPageNo+i)<=_page.totalPageCount; i++){
	pageNumbers.push(_page.currentPageNo+i);
}
if((pageNumbers.length<SIZE) 
	&&
	pageNumbers.indexOf(_page.totalPageCount)>-1 
	&& 
	(pageNumbers.indexOf(1)==-1)){
pageNumbers = [];
i =((_page.totalPageCount<SIZE)?_page.totalPageCount:SIZE) - 1;
for ( ; i>=0; i--){
	pageNumbers.push(_page.totalPageCount-i);
}
}
hListNumbers.selectedItem = _page.currentPageNo;
}
protected function btnPrev_clickHandler(event:MouseEvent):void {
	goPage((hListNumbers.selectedItem as uint) - 1);
}
protected function btnNext_clickHandler(event:MouseEvent):void {
	goPage((hListNumbers.selectedItem as uint) + 1);
}
/**
* 向上分发事件,一般情况下,需要与服务器端通信
*/ 
private function goPage(pageNo:uint):void{
	_page.currentPageNo = pageNo;
	this.dispatchEvent(new PageEvent(_page, "goPage"));
}
protected function hListNumbers_changeHandler(event:ListEvent):void {
	goPage(hListNumbers.selectedItem as uint);
}
protected function lbtnFirst_clickHandler(event:MouseEvent):void {
	goPage(1);
}
protected function lbtnLast_clickHandler(event:MouseEvent):void {
	goPage(_page.totalPageCount);
}
protected function pageSize_changeHandler(event:NumericStepperEvent):void {
_page.totalPageCount = _page.totalCount / pageSize.value;
_page.totalPageCount += ((_page.totalCount % pageSize.value)>0)?1:0;
if (_page.totalPageCount>0){
	_page.currentPageNo = 1;
	goPage(_page.currentPageNo);
}
}
protected function btnGo_clickHandler(event:MouseEvent):void {
var pageNo:int = (Number)(targetPageNo.text);
if (0==pageNo) {
	targetPageNo.text = 1 + "";
}
if(pageNo<=0){
	targetPageNo.text = 1 + "";
}
if (pageNo>_page.totalPageCount){
	targetPageNo.text = _page.totalPageCount + "";
}
pageNo = (Number)(targetPageNo.text);
goPage(pageNo);
}
]]>
</mx:Script>
<mx:Text text="{page.totalCount+'条记录'}" />
<mx:Text text="每页"/>
<mx:NumericStepper id="pageSize" 
  minimum="10" stepSize="5" maximum="5000" value="20" 
  change="pageSize_changeHandler(event)"/>
<mx:HBox id="hbFirst">
<mx:LinkButton id="lbtnFirst" label="1..." fontWeight="normal" click="lbtnFirst_clickHandler(event)"/>
</mx:HBox>
<mx:HBox id="hbPrev">
	<mx:Button id="btnPrev" icon="@Embed(source='/assets/prev_page.gif')" enabled="{1!=hListNumbers.selectedItem}" toolTip="上一页" click="btnPrev_clickHandler(event)" cornerRadius="20" alpha="1.0" borderColor="#FDFDFD" width="30"/>
</mx:HBox>
<mx:HorizontalList id="hListNumbers" dataProvider="{pageNumbers}" 
  columnCount="10" columnWidth="22" 
  borderStyle="none" backgroundColor="#FFFFFF" height="23"
  change="hListNumbers_changeHandler(event)">
</mx:HorizontalList>
<mx:HBox id="hbNext">
	<mx:Button id="btnNext" icon="@Embed(source='assets/next_page.gif')" enabled="{page.totalPageCount!=hListNumbers.selectedItem}" toolTip="下一页" 	click="btnNext_clickHandler(event)" cornerRadius="20" borderColor="#F9FBFC" width="30"/>
</mx:HBox>
<mx:HBox id="hbLast">
	<mx:LinkButton id="lbtnLast" label="{'...'+page.totalPageCount}" fontWeight="normal" click="lbtnLast_clickHandler(event)"/>
</mx:HBox>
<mx:TextInput maxChars="3" restrict="0-9" textAlign="right" id="targetPageNo"/>
<mx:Button label="Go" cornerRadius="10" width="50" id="btnGo" click="btnGo_clickHandler(event)"/>
</mx:HBox>

 

 

4、调用

<components:PageBar id="pageBar" goPage="pagedQuery()"/>

/**
* 调用服务器端方法
*/
private function pagedQuery():void{ 
	itemManager.pagedQuery( condition.text, pageBar.page.currentPageNo, pageBar.pageSize.value); }
}
 

/**
 * 相应分页查询方法
 */
private function onPagedQuery(event:ResultEvent):void{
	pageBar.page = Page.buildPage(event.result); items = pageBar.page.resultList;  // items为DataGrid的dataProvider
}

 

0
0
分享到:
评论

相关推荐

    分页最新控件用法(C#)

    DevExpress和Telerik是两个知名的UI控件库,它们提供了丰富的分页控件。例如,DevExpress的ASPxGridView控件和Telerik的RadGrid控件都支持强大的分页功能。这些控件不仅提供了基本的分页,还支持自定义样式、分页...

    分页条控件

    分页条控件,可以设置分页条的长度,背景色,对齐方式等 使用方式: 1,将分页条的BindMethod属性设置为你绑定数据的方法的名称,这里为BindRepeater, 2,例子代码 public void BindRepeater() { this....

    仿Iphone风格翻页控件,源码及Jar包.zip

    在这个自定义控件中,你需要实现页面的绘制逻辑,比如圆点的大小、颜色、位置等,并根据页面状态动态更新这些属性。 2. 事件监听:添加对触摸事件的支持,使得用户可以通过滑动或点击进行页面切换。这可能涉及到...

    JS+Jquery分页插件

    用户可以根据需要调整分页插件的配置,如自定义样式、添加额外的分页选项等,以满足特定项目的需求。 总结来说,JS+jQuery分页插件通过利用jQuery库的强大功能,结合CSS样式表,可以轻松实现网页的高效分页功能,...

    基于jQuery的实现简单的分页控件

    在本文中,我们将探讨如何基于jQuery实现一个简单的分页控件。分页控件是网页应用中常见的功能,用于管理大量的数据,使用户能够按页浏览而不是一次性加载所有内容。以下是一个逐步的实现过程。 首先,分页控件的...

    java页面查询结果分页

    6. **PageBar**: 分页栏,通常包含前后翻页按钮、跳转至指定页等元素。 - 示例代码中使用了`MainPageBar.jsp`作为分页栏组件。 #### 代码实现分析 - **HTML表格构建**: - 使用`while`循环遍历`nStartLine`到`...

    非常好用的Zend Framework分页类

    本文详细介绍了如何在Zend Framework中实现和使用一个高效的分页类。Zend Framework是PHP语言开发的一个开源框架,其设计宗旨是推动Web 2.0和AJAX应用的快速发展。而分页功能是Web开发中经常用到的一个重要功能,它...

    vue分页组件table-pagebar使用实例解析

    在本实例中,我们讨论的是如何使用Vue分页组件`table-pagebar`,该组件是基于Bootstrap风格设计的,能够方便地实现数据的分页展示。 `table-pagebar`组件的设计目的是为了帮助开发者更轻松地在Vue项目中添加分页...

    在asp.net(C#)中采用自定义标签和XML、XSL显示数据

    文章还提到了另一个自定义标签PageBar,它负责生成分页导航条。这个类包含分页相关的属性,比如当前页码(PageNum)、每页显示的项目数(PageSize)以及总页数(PageCount)。在Render方法中,它根据这些属性动态...

    EXTJS分页全面分析

    `displayMsg`用于自定义显示消息,`emptyMsg`则为没有记录时的提示信息。 ##### 7. 初始化GridPanel 最后初始化`GridPanel`,设置其宽度、高度等属性,并将其与存储器、列模型以及分页工具栏绑定起来: ```...

    简单分页条SimplePagebar.zip

    SimplePagebar一个使用 TypeScript 开发的简单分页条,支持首页、末页、上一页、下一页、自定义页码切换。使用说明只需把 release 文件夹内文件放入你的项目,引入 SimplePagebar.js文件即可。具体使用方法请看demo

    Jquery+JSon 无刷新分页实现代码

    1. **分页控件类设计:** 在代码中定义了一个PageBar类,这个类继承自WebControl,用于实现分页功能。它主要包括以下属性:PageIndex、PageCount和DisplayCount。其中,PageIndex代表当前页码,PageCount代表总页数...

    css实现的漂亮的分页效果代码(橘黄色与蓝色)

    为了自定义这个分页效果以适应不同的网站设计,你可以修改以下参数: 1. 颜色:更改边框颜色(如`border-color`)、文本颜色(如`color`)和背景颜色(如`background-color`)。 2. 尺寸:调整分页按钮的宽度、高度...

    废客列表分页JS效果

    { this.srcName= srcName; this.dstName= dstName; this.curP= 1;//默认当前页为第一页 ... this.result= {pagedata:[],pagebar:'',limit:[0,0],report:''}; this.parse();/*总纪录数*/ }

    cellpagebar

    【cellpagebar】是一款基于jQuery的原创分页条插件,设计目的是为了提供高度自定义的样式和灵活的分页处理逻辑,特别适用于那些依赖AJAX进行数据交互的网站。这款插件允许开发者轻松地集成到自己的项目中,提升用户...

    JavaScript实现列表分页功能特效

    例如,通过修改`&lt;a&gt;`标签的`href`属性来设置点击跳转的地址,通过类名来控制当前页码的样式,以及通过`&lt;li&gt;`标签来构建分页控件等。 综上所述,JavaScript在实现列表分页功能特效中扮演着至关重要的角色。开发者...

    FlexPageBarDemo

    在FlexPageBarDemo中,我们可能能看到如何利用媒体查询或者Flex布局,使分页条在桌面、平板和手机上都能良好显示。 6. **无限滚动**:除了传统的分页方式,FlexPageBar可能还实现了无限滚动功能。这种模式下,当...

    PagedBar:js的分页原始码-js

    `PagedBar`是一个基于JavaScript的分页控件,它允许用户轻松地在大量数据中进行导航。本篇文章将深入探讨`PagedBar`的实现原理,以及如何在项目中应用这个开源组件。 一、分页原理 分页的基本原理是将大数据集分割...

Global site tag (gtag.js) - Google Analytics