在特定索引处将新行插入已排序的ADG中

时间:2013-01-09 16:29:24

标签: flex

我尝试在我选定的行下面的adg中插入一个新行。

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
           xmlns:s="library://ns.adobe.com/flex/spark"
           xmlns:mx="library://ns.adobe.com/flex/mx"
           minWidth="955"
           minHeight="600">

<fx:Script>
    <![CDATA[
        import mx.collections.XMLListCollection;
        import mx.events.FlexEvent;
        [Bindable]
        protected var worklist:XMLListCollection;

        protected var xml:XML=<items>
                <item><value>1</value></item>
                <item><value>2</value></item>
                <item><value>3</value></item>
                <item><value>4</value></item>
            </items>;

        protected function adg_creationCompleteHandler(event:FlexEvent):void
        {
            var list:XMLList=xml.item;
            worklist=new XMLListCollection(list);
            trace(worklist);
        }

        protected function createBut_clickHandler(event:MouseEvent):void
        {
            var xml:XML=<item/>;
            var selInd:int=adg.selectedIndex;
            var insertPos:int=selInd + 1;
            worklist.addItemAt(xml, insertPos);
        }
    ]]>
</fx:Script>

<s:layout>
    <s:VerticalLayout/>
</s:layout>

<mx:AdvancedDataGrid id="adg"
                     dataProvider="{worklist}"
                     creationComplete="adg_creationCompleteHandler(event)">
    <mx:groupedColumns>
        <mx:AdvancedDataGridColumn dataField="value"/>
    </mx:groupedColumns>
</mx:AdvancedDataGrid>

<s:Button id="createBut"
          label="createRow"
          click="createBut_clickHandler(event)"/>

这是正常的,直到我先对列进行排序。然后,新行将放在第一个或最后一个索引处,而不是指定的索引处。如何使用常规排序功能并将新行放在特定索引处,即使列值为空?

1 个答案:

答案 0 :(得分:0)

在顶部或底部添加null值的原因是因为排序已打开。如果排序在asc中,则空值总是会添加到顶部。如果排序在desc,它将被添加到底部。

为了更好地理解这一点,试试这个

<fx:Script>
    <![CDATA[
        import mx.collections.XMLListCollection;
        import mx.events.FlexEvent;
        [Bindable]protected var worklist:XMLListCollection;
        private var newvalue:int = 7;

        protected var xml:XML=<items>
                <item><value>1</value></item>
                <item><value>2</value></item>
                <item><value>3</value></item>
                <item><value>4</value></item>
                <item><value>5</value></item>
                <item><value>6</value></item>
            </items>;

        protected function adg_creationCompleteHandler(event:FlexEvent):void
        {
            var list:XMLList=xml.item;
            worklist=new XMLListCollection(list);
            trace(worklist);
        }

        protected function createBut_clickHandler(event:MouseEvent):void
        {
            var xml:XML=<item><value>{newvalue}</value></item>;
            var selInd:int=adg.selectedIndex;
            var insertPos:int=selInd + 1;
            worklist.addItemAt(xml, insertPos);
            worklist.refresh();
            newvalue++;
        }
    ]]>
</fx:Script>

每次创建新行时,我都增加了一个数值。 将在顶部或底部添加7,8,9(取决于排序)。 10,11,12,..........将上一个或下一个(取决于排序)添加到1,因为该值被视为字符串。

注意:内部的值保存在您希望的确切索引位置。

修改

只需将创建行按钮单击处理程序更改为

即可
protected function createBut_clickHandler(event:MouseEvent):void
{
    var xml:XML=<item><value>{newvalue}</value></item>;
    var selectedItem:Object = adg.selectedItem;
    worklist = new XMLListCollection(worklist.source);
    var selInd:int= worklist.getItemIndex(selectedItem);
    var insertPos:int=selInd + 1;
    worklist.addItemAt(xml, insertPos);
    worklist.refresh();
    newvalue++;
}

这里做的是..当sort(asc)打开时,在用户选择了他们想要输入的行之后,然后单击Create Row ..我将删除排序和添加所选值旁边的条目..

如果你想在整个过程中打开排序,那么它实际上很难......在某些时候你必须删除排序以向用户显示数据的实际位置。