предотвращение ошибок по порядку вкладок - AdvancedDataGrid itemeditor - PullRequest
1 голос
/ 08 августа 2010

Оформить заказ, следуя примеру кода

<?xml version="1.0" encoding="utf-8"?>
        <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
    <![CDATA[
        import mx.controls.CheckBox;
        import mx.events.CollectionEventKind;
        import mx.events.CollectionEvent;
        import mx.events.DataGridEventReason;
        import mx.events.AdvancedDataGridEvent;
        private function calculateCommission(evt:AdvancedDataGridEvent):void
        {
            if(evt.reason == DataGridEventReason.CANCELLED)
                return;
            var dtIndex:int = evt.currentTarget.selectedIndex;
        var dtField:String = evt.dataField;
        var gross:*, commPer:*, comm:*, net:*;

            var dataGross:* = evt.itemRenderer.data.gross;
            var dataCommPer:* = evt.itemRenderer.data.commPer;
            var dataComm:* = evt.itemRenderer.data.comm;
            var dataNet:* = evt.itemRenderer.data.net;
            switch(dtField)
            {
                case "gross":
                    trace("gross column edited.");
                    gross = evt.currentTarget.itemEditorInstance.text;
                    if( (dataCommPer != null) && (dataCommPer!="") )
                    {
                        comm = (gross * dataCommPer) / 100;
                        net = gross - comm;
                    }else if( (dataComm != null) && (dataComm!=""))
                    {
                        commPer = (dataComm * 100) / gross;
                        net = gross - dataComm;
                    }else{
                        net = gross;
                    }
                    break;
                case "commPer":
                    trace("comm % column edited.");
                    commPer = evt.currentTarget.itemEditorInstance.text;
                    if( (dataGross != null) && (dataGross!="") )
                    {
                        comm = dataGross * (commPer / 100);
                        net = dataGross - comm;
                    }
                    break;
                case "comm":
                    trace("comm column edited.");
                    comm = evt.currentTarget.itemEditorInstance.text;
                    if( (dataGross != null) && (dataGross!="") )
                    {
                        commPer = (100 * comm) / dataGross;
                        net = dataGross - comm;
                    }
                    break;
                case "net":
                    trace("net column edited.");
                    net = evt.currentTarget.itemEditorInstance.text;
                    break;
            }

            var item:Object = evt.currentTarget.dataProvider.getItemAt(dtIndex);

            if(gross!=null)
                item.gross = gross;
            if(commPer!=null)
                item.commPer = commPer;
            if(comm!=null)
                item.comm = comm;
            if(net!=null)
                item.net = net;
            //evt.currentTarget.dataProvider.itemUpdated(item);

            var colEvent:CollectionEvent = new CollectionEvent(CollectionEvent.COLLECTION_CHANGE,true,false, CollectionEventKind.UPDATE);
            colEvent.items = [item];
            colEvent.location =  dtIndex;
            (evt.currentTarget.dataProvider as ArrayCollection).dispatchEvent(colEvent);
        }

        private function preventEditing(evt:AdvancedDataGridEvent):void
        {
            if(evt.reason == DataGridEventReason.CANCELLED)
                return;
            var dtIndex:int = evt.currentTarget.selectedIndex;
            var item:Object = evt.currentTarget.dataProvider.getItemAt(dtIndex);
            if(item.markAsReadOnly && evt.dataField!="markAsReadOnly")
                evt.preventDefault();
        }
    ]]>
</mx:Script>
<mx:ArrayCollection id="dgArr">
    <mx:Array>
        <mx:Object firstName="Jake" lastName="Tyler" gross="" commPer="" comm="" net="" markAsReadOnly=""/>
        <mx:Object firstName="Ryan" lastName="McCarthy" gross="" commPer="" comm="" net=""  markAsReadOnly=""/>
        <mx:Object firstName="Jill" lastName="Miller" gross="" commPer="" comm="" net=""  markAsReadOnly=""/>
        <mx:Object firstName="John" lastName="Rico" gross="" commPer="" comm="" net=""  markAsReadOnly=""/>
        <mx:Object firstName="Diz" lastName="Watson" gross="" commPer="" comm="" net=""  markAsReadOnly=""/>
        <mx:Object firstName="Lolo" lastName="Hurley" gross="" commPer="" comm="" net=""  markAsReadOnly=""/>
    </mx:Array>
</mx:ArrayCollection>

<mx:AdvancedDataGrid dataProvider="{dgArr}" x="100" y="100" 
    editable="true" rowCount="5" 
    itemEditEnd="calculateCommission(event)" itemEditBeginning="preventEditing(event)">
    <mx:groupedColumns>
        <mx:AdvancedDataGridColumn headerText="Read Only" dataField="markAsReadOnly" headerWordWrap="true" editorDataField="selected" editable="true" itemRenderer="mx.controls.CheckBox" rendererIsEditor="true"/>
        <mx:AdvancedDataGridColumn headerText="First Name" dataField="firstName" editable="false"/>
        <mx:AdvancedDataGridColumn headerText="Last Name" dataField="lastName" editable="false"/>
        <mx:AdvancedDataGridColumnGroup headerText="Commission Calculation">
            <mx:AdvancedDataGridColumn dataField="gross" headerText="Gross" itemRenderer="mx.controls.TextInput" rendererIsEditor="true"/>
            <mx:AdvancedDataGridColumn dataField="commPer" headerText="Comm %" itemRenderer="mx.controls.TextInput" rendererIsEditor="true"/>
            <mx:AdvancedDataGridColumn dataField="comm" headerText="Comm" itemRenderer="mx.controls.TextInput" rendererIsEditor="true"/>
            <mx:AdvancedDataGridColumn dataField="net" headerText="Net" itemRenderer="mx.controls.TextInput" rendererIsEditor="true"/>
        </mx:AdvancedDataGridColumnGroup>
    </mx:groupedColumns>
</mx:AdvancedDataGrid>
</mx:Application>

Если вы введете некоторые значения в столбце брутто, а затем в comm%, он рассчитывает комиссию, а затем чистую сумму.Все работает хорошо, но когда вы устанавливаете флажок в первом столбце и пытаетесь перемещаться, вкладка не работает для этой конкретной строки.Он не работает в обоих направлениях.

Если я удаляю evt.preventDefault, табуляция будет работать правильно, но она не сможет полностью пометить строку как доступную только для чтения.Может кто-нибудь помочь мне получить подход, чтобы пометить строку как только для чтения, но фокус управления также должен работать правильно.

Ответы [ 2 ]

1 голос
/ 13 мая 2011

Попробуйте манипулировать editedItemPositiong сетки данных в событии itemEditBeginning, например:

dg.editedItemPosition = {rowIndex: event.rowIndex, columnIndex: event.columnIndex + 1};

Эта строка поместит фокус на следующий столбец в сетке. Конечно, вам нужно адаптировать это решение, если вы не позволяете редактировать последний столбец в таблице данных.

0 голосов
/ 13 февраля 2011

Удар в темноте. Нужно ли обновлять порядок вкладок вручную?

...