2010-02-22 63 views
1

Flex中可用的排序功能假定您有权访问所有数据,但我使用分页数据网格(使用自定义代码),数据网格绑定到ArrayCollection实例,在下一个页面调用我更改数据提供的数据,一切正常,但为了排序我需要覆盖点击或事件更好地覆盖arraycollection的排序方法Flex自定义排序功能与服务器端支持

所有这一切都是为了能够做到一个服务器端的排序。

有没有人遇到过这种问题?

回答

0

我不确定我是否真的理解这个问题,但听起来好像您需要在服务器端进行排序。如果没有将所有数据加载到Flex应用程序中,则无法对其进行分类。

+0

确切地说,我想做服务器端排序,但我不知道哪个方法必须被覆盖,现在我正在尝试为了实现sort()方法,但我不确定这是否是最好的方法,我已经尝试覆盖datagrid头部上的click事件而没有好的结果。 – Felipe 2010-02-22 18:58:21

+0

我不确定你明白我的意思是服务器端。你连接什么语言来获取你的数据?不管它是什么,你使用sql来检索提供给flex的数据吗?如果是这样,把你的排序在那里。 Flex中的覆盖方法与服务器端根本没有任何关系。 – 2010-02-22 20:53:26

+0

你是如何在AdvancedDataGrid中实现这种排序的? – 2012-11-19 08:28:12

0

我理解了这样的问题:

他拥有flex客户端中所有数据的一部分。因为客户端不知道所有的数据,所以排序不能在客户端完成。 他已经在服务器端排序工作。

他现在需要做的是:当用户点击数据网格的头部时,他想要进行服务器调用并获取有序数据。 单击网格标题时的默认行为是数据是按客户端排序的。 这就是为什么他需要客户端的东西。

我发现的唯一的事情是这样的:

<mx:DataGrid xmlns:mx="http://www.adobe.com/2006/mxml" 
headerRelease="onHeaderRelease(event)"> 

指定的函数onHeaderRelease是一旦被点击的标题的mousebutton称为(该mousebutton被再次释放)。

函数示例。也许你可以从这里拿起

 public function onHeaderRelease(evt:DataGridEvent):void 
     { 
      var grd:DataGrid = DataGrid(evt.currentTarget); 
      Alert.show(evt.columnIndex + " : " + (DataGridColumn)(grd.columns[evt.columnIndex]).sortDescending, "ColumnIndex : Sorted Descending?"); 
      // do the server called and get the sorted array back 
     } 

我希望这会帮助你!

+0

谢谢你的答案countcb,我试图避免视觉技巧(连接鼠标点击事件和类似的事情)主要是因为这不让我使用几乎标准的网格。 – Felipe 2010-03-02 14:20:45

0

我实施了以下解决方案,目前工作情况良好,但可能会进行一些改进。

我延长ArrayCollection类和覆盖排序设置/获取和更新方法

package custom 
{ 
import mx.collections.ArrayCollection; 
import mx.collections.Sort; 

/** 
* Dispatched when a sort is required 
* 
* @eventType custom.PaginatedCollectionEvent.SORT 
*/ 
[Event(name="sort" , type="custom.PaginatedCollectionEvent")] 

public class PaginatedCollection extends ArrayCollection 
{ 
    private var _sort:Sort; 

    public function PaginatedCollection(source:Array=null) 
    { 
     super(source); 
    } 

    public function setDefaultSort (s:Sort):void 
    { 
     _sort = s; 
    } 


    override public function set sort(s:Sort):void 
    { 
     _sort = s; 
     if (!s) 
      return; 

     var event:PaginatedCollectionEvent = new PaginatedCollectionEvent(PaginatedCollectionEvent.SORT); 
     event.fields = s.fields; 
     event.s = s; 
     this.dispatchEvent(event); 
    } 

    override public function get sort():Sort 
    { 
     return _sort; 
    } 

    /** 
    * Avoid the internal sorting implementation, with this it's possible 
    * to do a server side sort. 
    * 
    * @return true 
    */ 
    override public function refresh():Boolean 
    { 
     return true; 
    } 

    /** 
    * Wrapper for ArrayCollection refesh implementation 
    */ 
    public function superRefresh():Boolean 
    { 
     return super.refresh(); 
    } 
} 

}

+0

也试过这个。不知何故排序字段是空的。 – 2012-03-27 07:51:23

2

下面是我用来解决这个问题的步骤......这个解决方案的好处是我可以允许Flex与我一起“排序”,这样可以使DataGrid上的排序方向图标保持可见。

步骤:

  1. 使用DataGrid的headerRelease事件拦截 “排序” 请求。

  2. 保留列的当地地图及其当前的排序方向......这是flex对其排序的模拟...所以所有列都以“上升”开始,然后方向切换只有当给定的列被连续点击两次。这可能可以通过观察柔性内部结构来完成,但我并不在意尝试。

  3. headerRelease事件使用其事件中请求的列以及先前请求的列和当前列排序方向的地图来决定是否更新本地地图中的排序方向。

  4. 调用服务器以获取适当排序的数据页面。

在这一点上,则Flex希望将数据和排序...(除非你preventDefault()方法headerRelease事件)......允许Flex中“排序”不搞乱任何东西的数据,从而使方向图标继续正常工作,您可以:

  1. “行ID”字段添加到您的SQL结果集的服务器上,这简直是在结果集中每个顺序排柜台上,在它被分类和分页之后......无论应用什么样的排列方向,该ID总是上升的。

  2. 设置在DataGridColumns的sortCompareFunction到使用该行ID的“虚拟”之类的......这样:

public function doNothingSort(a:Object, b:Object):int { 
    if(weAreCurrentlyInAscendingDirection) 
     return ObjectUtil.numericCompare(a.new, b.num); 
    else 
     return ObjectUtil.numericCompare(b.num, a.num); 
} 

这将允许柔性通过运行“页”,并保持一切...因此,它很高兴,你很高兴,因为你有图标...

+0

我使用了不同的方法在Flex端进行“虚拟”排序:我在我的处理函数上使用了preventDefault。由于我已经有了排序列的本地映射,所以在从服务器获取数据之后,我会将相同的排序手动应用到我的dataProvider。我扩展了Sort类,并重写了sort()函数,所以什么也不做,并返回。我在我的数据提供者上使用这个DummySort类。 – Akshay 2012-04-20 06:25:56