0
votes

I'm having a strange problem.

In Flex 4, I have a Spark DataGrid and have both an item renderer and a sort compare function defined for one of the columns. Strangely, this column will not sort in descending order.

The data is originally not sorted. Clicking on the column header displays the "up" arrow and the data sorts in ascending order. However, clicking on the column header again does nothing. The "up" arrow stays and the data stays sorted in ascending order.

I have debugged through the code and found that column.sortDescending in the sort compare function is always false (should this be true when the a descending sort should happen?).

I have Googled this for a long while and searched on here but haven't found anything.

Anyone have any ideas?

Thanks in advance.

//Edit

Simple Example code:

CreationComplete function initializes data using some random values:

protected function application1_creationCompleteHandler(event:FlexEvent):void
            {
                arrayData = new ArrayCollection();

                var obj:Object;
                for(var i:Number=0; i < 10; i++) {
                    obj = new Object();
                    obj.value1 = i;
                    obj.value2 = Math.floor(Math.random() * (1 + 100 - 1)) + 1;
                    obj.value3 = Math.floor(Math.random() * (1 + 100 - 1)) + 1;

                    arrayData.addItem(obj);
                }
            }

Datagrid defines columns with 4th column having an item renderer and sort compare function defined.

<s:DataGrid x="122" y="142" width="391" height="223" requestedRowCount="4" dataProvider="{arrayData}">
        <s:columns>
            <s:ArrayList>
                <s:GridColumn dataField="value1" headerText="Value 1"></s:GridColumn>
                <s:GridColumn dataField="value2" headerText="Value 2"></s:GridColumn>
                <s:GridColumn dataField="value3" headerText="Value 3"></s:GridColumn>
                <s:GridColumn headerText="Value 3" sortable="true" itemRenderer="ItemRendererTest" sortCompareFunction="sortCompareFunc"></s:GridColumn>
            </s:ArrayList>
        </s:columns>
        <s:typicalItem>
            <fx:Object dataField1="Sample Data" dataField2="Sample Data" dataField3="Sample Data"></fx:Object>
        </s:typicalItem>
    </s:DataGrid>

Item renderer code:

override public function prepare(hasBeenRecycled:Boolean):void {
                var columnString:String = data["value1"] + ":" + data["value2"] + ":" + data["value3"];

                lblData.text = columnString;
            }

Sort compare function:

private function sortCompareFunc(obj1:Object, obj2:Object, col:GridColumn):int {
                var obj1String:String = obj1["value1"] + ":" + obj1["value2"] + ":" + obj1["value3"];
                var obj2String:String = obj2["value1"] + ":" + obj2["value2"] + ":" + obj2["value3"];

                var collator:SortingCollator = new SortingCollator();

                return collator.compare(obj1String, obj2String);
            }
1
Please show enough code to demonstrate this problem. A simple runnable sample would be ideal.JeffryHouser

1 Answers

4
votes

Just had something similar to this myself seems that the spark grid control needs a dataField defining even though you have a custom sort compare function, simply try adding dataField="value1" on your 4th column even though your not going to use it, see if that helps.