Flex DataGrid Добавить новую строку с помощью события одного клика - PullRequest
1 голос
/ 10 ноября 2009

Я пытаюсь реализовать следующие функции:

Сетка данных Flex имеет 1 созданную строку по умолчанию. Когда пользователь нажимает на второй ряд, необходимо создать новую строку и сделать ее редактируемой.

Вот то, что уже работает - пользовательские вкладки над столбцами, а когда пользовательские вкладки находятся в последнем столбце, создается новая строка со значениями по умолчанию.

Вот также то, что уже работает - пользователь нажимает кнопку за пределами сетки, которая добавляет новую строку.

(itemEditBegin и itemEditEnd были реализованы)

Вот что НЕ работает: когда я «нажимаю один раз» на второй строке (данных пока нет - строка равна нулю), как определить, что выбранная строка является второй строкой, и сделать ее редактируемой? Могу ли я выяснить rowIndex из MouseEvent и использовать это, чтобы добавить новую строку?

Найдите код ниже:

<mx:DataGrid id="myGrid" editable="true" click="clickEvent(event)"
     itemEditEnd="endEdit(event)" itemEditBegin="beginEdit(event)" variableRowHeight="true" >

private function clickEvent(ev:Event):void
{
    var i:Object = MouseEvent(ev).currentTarget;
        // is this the right event?
}

Ответы [ 2 ]

3 голосов
/ 10 ноября 2009

Если нет данных, не будет ни строки, ни itemRenderer, и, следовательно, технически отсутствует индекс строки. e.target будет содержать ListBaseContentHolder, а e.currentTarget будет содержать сам DataGrid. Однако вы можете использовать положение мыши, чтобы рассчитать, какая строка была бы в выбранном месте. Вот маленький грязный трюк, чтобы сделать это - он не полностью протестирован и, следовательно, может не сработать в крайних случаях.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
    xmlns:local="*" creationComplete="create();">
    <mx:DataGrid id="myGrid" editable="true" click="clickEvent(event)"
     variableRowHeight="true" >
    <mx:columns>
        <mx:DataGridColumn dataField="d"/>
        <mx:DataGridColumn/>
    </mx:columns>
    </mx:DataGrid>
    <mx:Script>
        <![CDATA[
            import mx.controls.listClasses.ListRowInfo;
            import mx.controls.listClasses.ListBaseContentHolder;
            private function clickEvent(e:MouseEvent):void
            {
                if(!(e.target is ListBaseContentHolder))
                    return;
                var holder:ListBaseContentHolder = 
                    ListBaseContentHolder(e.target);
                var rowIndex:Number = -1;
                var length:Number = holder.rowInfo.length;
                var rowInfo:ListRowInfo;
                for(var i:Number = 0; i < length; i++)
                {
                    rowInfo = holder.rowInfo[i];
                    if(e.localY > rowInfo.y && 
                        e.localY < rowInfo.y + rowInfo.height)
                    {
                        rowIndex = i;
                        break; 
                    }
                }
                trace("Clicked on " + rowIndex);
            }
            private function create():void
            {
                myGrid.dataProvider = [{d:"A"},{d:"B"}];
            }
        ]]>
    </mx:Script>
</mx:Application>
0 голосов
/ 10 ноября 2009

Отличный вопрос, DataGrid поддерживает выбор объектов в dataProvider DataGrid. Но это не позволяет легко выбирать / mouseOver строк, которые не имеют элементов в них (нулевые строки).

1) Я бы поставил фиктивную строку в конце DataGrid, чтобы ее можно было легко выбрать с помощью DataGrid.
2) В противном случае я бы проверил, находятся ли mouseX / mouseY в параметрах нулевой строки, на которую вы только что нажали (используя глобальные свойства нулевой строки X, Y, width, height).

Дайте мне знать, что работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...