1

签出以下示例代码

<?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,制表符可以正常工作,但它破坏了将行标记为只读的整个目的。任何人都可以帮助我获得一种将行标记为只读的方法,但控制焦点也应该正常工作。

4

2 回答 2

1

尝试在 itemEditBeginning 事件中操作数据网格的editedItemPositiong,如下所示:

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

此行将焦点放在网格中的下一列。当然,如果您要阻止编辑数据网格中的最后一列,则需要调整此解决方案。

于 2011-05-13T07:05:46.773 回答
0

黑暗中的刺伤..标签顺序是否需要手动更新?

于 2011-02-13T12:13:27.207 回答