2010-02-22 1 views
1

Возможности сортировки, доступные в Flex, предполагают, что у вас есть доступ ко всем данным, но я использую разбитый на страницы datagrid (с настраиваемым кодом), datagrid привязан к ArrayCollection Например, при вызове следующей страницы я изменяю данные датапараудера, и все работает нормально, но для сортировки мне нужно переопределить щелчок или событие, лучше переопределить метод сортировки массива arraycollectionВозможности пользовательской сортировки Flex с поддержкой на стороне сервера

Все это должно быть в состоянии сделать сортировка на стороне сервера.

Неужели кто-нибудь сталкивался с такой проблемой?

ответ

0

Я не уверен, что я действительно понимаю вопрос, но похоже, что вам нужно делать сортировку на серверной стороне. Если у вас нет всех данных, загружаемых в приложение flex, вы не можете его сортировать.

+0

точно, я хочу сделать сортировку на стороне сервера, но я не знаю, какой метод должен быть переписанным, прямо сейчас я пытаюсь чтобы реализовать метод sort(), но я не уверен, что это лучший способ сделать это, я уже пробовал переопределить событие click над заголовком datagrid без хорошего результата. – Felipe

+0

Я не уверен, что вы понимаете, что я имею в виду на стороне сервера. На каком языке вы подключаетесь для получения ваших данных? Независимо от того, что это такое, вы используете sql для извлечения данных для гибки? Если да, поставьте свой вид там. Переопределение методов в flex не имеет ничего общего с серверной частью. –

+0

Как вы реализовали этот вид в AdvancedDataGrid? –

0

я понял проблему так:

Он имеет часть общих данных в гибком клиента. Поскольку клиент не знает всех данных, сортировка не может быть выполнена на стороне клиента. У него уже работает сортировка серверов.

Теперь ему нужно сделать следующее: когда пользователь нажимает на заголовок datagrid, он хочет сделать вызов сервера и вернуть отсортированные данные. Поведение по умолчанию при щелчке заголовка сетки состоит в том, что данные сортируются на стороне клиента. Так вот почему ему нужно что-то на стороне клиента.

Единственное, что я нашел, было это:

<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

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

Пробовал это тоже. Каким-то образом поля сортировки пустые. –

2

Здесь множество сортировки шаги, которые я использовал, чтобы решить эту проблему ... хорошая вещь об этом растворе что я могу позволить Flex «сортировать» вместе со мной, что сохраняет значки направления сортировки, видимые на DataGrid.

Шаги:

  1. использовать событие headerRelease в DataGrid для перехвата "сортировки" запрос.

  2. сохранить локальную карту столбцов и их текущие направления сортировки ... это мимика того, что делает flex в своем роде ... поэтому все столбцы начинаются с «восходящего», а затем направление переключается только тогда, когда данный столбец дважды щелкнут по строке.это, вероятно, можно было бы сделать, наблюдая за внутренними структурами Flex, но я не хотел этого делать.

  3. Событие headerRelease использует запрашиваемый столбец из своего события вместе с предыдущим запрошенным столбцом и картой текущих направлений сортировки столбцов, чтобы решить, следует ли обновлять направление сортировки на локальной карте.

  4. сделать звонок на сервер, чтобы получить соответствующую сортировку страницы данных.

на данный момент, Flex хочет сортировать данные, а также ... (если вы preventDefault() событие headerRelease) ... чтобы позволить Flex для «сортировки» данные без Мессинг ничего до, и так что иконки направления продолжают функционировать должным образом, вы можете:

  1. добавить поле «идентификатор строки» на ваш результат SQL установлен на сервере, который просто счетчик для каждой последовательной строки в наборе результатов, после того, как он будет отсортирован и выгружен ... этот идентификатор всегда будет возрастать, независимо от того, какое направление будет применено.

  2. установить sortCompareFunction на DataGridColumns к «фиктивной» рода, который использует этот идентификатор строки ... как таковой:

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

 Смежные вопросы

  • Нет связанных вопросов^_^