سؤال

لدي datagrid، مملوءة كما هو موضح أدناه.عندما ينقر المستخدم على رأس العمود، أرغب في فرز الصفوف باستخدام الفرز المعجمي الذي يتم فيه استخدام العمود المحدد أولاً، ثم يتم استخدام الأعمدة المتبقية بالترتيب من اليسار إلى اليمين لكسر أي روابط.كيف يمكنني ترميز هذا؟

(لدي إجابة واحدة، وسأقوم بنشرها أدناه، ولكن بها مشكلة - سأشعر بسعادة غامرة إذا تمكن شخص ما من تقديم إجابة أفضل!)

وهنا التخطيط:

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="absolute" creationComplete="onCreationComplete()">

    <mx:Script source="GridCode.as" />

    <mx:DataGrid id="theGrid" x="61" y="55" width="466" height="317">
        <mx:columns>
            <mx:DataGridColumn dataField="A"/>
            <mx:DataGridColumn dataField="B"/>
            <mx:DataGridColumn dataField="C"/>
        </mx:columns>
    </mx:DataGrid>

</mx:Application>

وإليك رمز الدعم:

import mx.collections.ArrayCollection;
import mx.collections.Sort;
import mx.collections.SortField;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.events.DataGridEvent;

public function onCreationComplete():void
{
    var ar:ArrayCollection = new ArrayCollection();
    var ob:Object;
    for( var i:int=0; i<20; i++ )
    {
        ob = new Object();
        ob["A"] = i;
        ob["B"] = i%3;
        ob["C"] = i%5;
        ar.addItem(ob);
    }
    this.theGrid.dataProvider = ar;
}
هل كانت مفيدة؟

المحلول

أفضل إجابة وجدتها حتى الآن هي التقاط حدث headerRelease عندما ينقر المستخدم:

<mx:DataGrid id="theGrid" x="61" y="55" width="466" height="317"
        headerRelease="onHeaderRelease(event)">

يمكن لمعالج الأحداث بعد ذلك تطبيق ترتيب فرز على البيانات:

private var lastIndex:int = -1;
private var desc:Boolean = false;

public function onHeaderRelease(evt:DataGridEvent):void
{
    evt.preventDefault();

    var srt:Sort = new Sort();
    var fields:Array = new Array();

    if( evt.columnIndex == lastIndex )
    {
        desc = !desc;
    }
    else
    {
        desc = false;
        lastIndex = evt.columnIndex;
    }

    fields.push( new SortField( evt.dataField, false, desc ) );
    if( evt.dataField != "A" )
        fields.push( new SortField("A", false, desc) );
    if( evt.dataField != "B" )
        fields.push( new SortField("B", false, desc) );
    if( evt.dataField != "C" )
        fields.push( new SortField("C", false, desc) );
    srt.fields = fields;

    var ar:ArrayCollection = this.theGrid.dataProvider as ArrayCollection;
    ar.sort = srt;
    ar.refresh();
}

ومع ذلك، فإن هذا الأسلوب به مشكلة معروفة، وهي أن رؤوس الأعمدة لم تعد تعرض أسهمًا صغيرة لإظهار اتجاه الفرز.هذا هو التأثير الجانبي لاتصال evt.preventDefault () ولكن يجب عليك إجراء هذه المكالمة وإلا فلن يتم تطبيق الفرز المخصص الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top