读书人

Flex DataGrid 中的校验和TAB建有关问

发布时间: 2012-03-08 13:30:13 作者: rapoo

Flex DataGrid 中的校验和TAB建问题
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" width="100%" height="100%">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.validators.NumberValidator;
import mx.events.AdvancedDataGridEvent;
import flash.events.MouseEvent;
import mx.events.FlexEvent;
import mx.events.CollectionEvent;
import com.adobe.serialization.json.JSON;
import mx.rpc.events.ResultEvent;
import mx.managers.CursorManager;
import mx.rpc.events.FaultEvent;
import mx.events.PropertyChangeEvent;
import mx.events.CollectionEventKind;
import mx.controls.Alert;
import mx.controls.TextInput;
// import keyEvent.MyKeyEvent;
import flash.events.KeyboardEvent;
[Bindable]
private var dataSource:ArrayCollection = new ArrayCollection([
{xh:'1'},
{tjfl:'车间'},{tjfl:'外协'},{tjfl:'小计'},
{xh:'2'},
{tjfl:'车间'},{tjfl:'外协'},{tjfl:'小计'},
{xh:'3'},
{tjfl:'车间'},{tjfl:'外协'},{tjfl:'小计'},
{xh:'4'},
{tjfl:'车间'},{tjfl:'外协'},{tjfl:'小计'},

{cpbh:'总计'},
{tjfl:'车间'},{tjfl:'外协'},{tjfl:'小计'},

]);


private function checkIt(myEvent:Event):void
{
dg1.invalidateList();
}

private var nv:NumberValidator;

//This gets fired when the itemEditor is about to be destroyed. As a result of hitting enter, tab, or mouse clicking away.
private function onEditEnd(event:AdvancedDataGridEvent):void
{


var dataField:String = event.dataField;
var fCell:Array=[event.columnIndex,event.rowIndex];
//This tells us what the new data is about to be before it's committed.

var newData:String = TextInput(event.currentTarget.itemEditorInstance).text;


if((newData == null || newData == " ") && (dataField == 'cpgs' || dataField == 'xggs' || dataField == 'gzgs' || dataField == 'qtgs' || dataField == 'hj' || dataField == 'hbgs')){
newData="0";
TextInput(event.currentTarget.itemEditorInstance).text = "0";

}

nv = new NumberValidator();

if(dataField == 'cpgs' || dataField == 'xggs' || dataField == 'gzgs' || dataField == 'qtgs' || dataField == 'hj' || dataField == 'hbgs')
{
var val:* ;
nv.source = event.currentTarget.itemEditorInstance;
nv.property = "text";
nv.domain = "real";
nv.required = false;
nv.invalidCharError = "必须输入数字!";
val = nv.validate();

if(val.type == "invalid")
{
event.preventDefault();
if(newData.length!=0)
callLater(maintainEdit,fCell);
}
else
{
callLater(maintainFocus);
}
}
else{
callLater(maintainFocus);
}

}


//this checks to see if we're still in edit mode, and if we're not..invoke it
private function maintainEdit(colIndex:int,rowIndex:int):void
{
var editCell:Object = {columnIndex:colIndex, rowIndex: rowIndex};
if(dg1.editedItemPosition==null)
{
//This will invoke the datagrid's itemEditBegin
dg1.editedItemPosition = editCell;
callLater(validateCurrentEditor);
}
}

private function validateCurrentEditor():void
{
if(dg1.itemEditorInstance!=null)
{
nv.source = dg1.itemEditorInstance;


nv.validate();
}
}

//prevents enter/tab from moving onto the next cell after finishing editing.
private function maintainFocus():void
{
dg1.editedItemPosition = null;
}


]]>
</mx:Script>
<mx:Canvas verticalScrollBarStyleName="hh" height="100%" width="80%" horizontalCenter="0" verticalCenter="0" verticalScrollPolicy="auto">

<mx:AdvancedDataGrid id="dg1" designViewDataType="flat" sortExpertMode="true" sortableColumns="false" selectionMode="singleRow"
dataProvider="{dataSource}" height="492" width="95%" fontSize="14" fontFamily="Times New Roman" editable="true"
enabled="true" y="70" horizontalScrollPolicy="auto" verticalScrollPolicy="auto" itemEditEnd="onEditEnd(event)"
>

<mx:groupedColumns>
<mx:AdvancedDataGridColumn headerText="编号" dataField="id" width="100" textAlign="center" visible="false"/>
<mx:AdvancedDataGridColumn headerText="序号" dataField="xh" width="50" textAlign="center" editable="false" />
<mx:AdvancedDataGridColumn headerText="产品编号" dataField="cpbh" width="100" textAlign="center" />
<mx:AdvancedDataGridColumn headerText="统计分类" dataField="tjfl" width="80" editable="false" textAlign="center"/>

<mx:AdvancedDataGridColumnGroup headerText="工时统计" editable="false">
<mx:AdvancedDataGridColumn headerText="产品工时" dataField="cpgs" width="100" textAlign="center"/>
<mx:AdvancedDataGridColumn headerText="修改工时" dataField="xggs" width="100" textAlign="center"/>
<mx:AdvancedDataGridColumn headerText="后备工时" dataField="hbgs" width="120" textAlign="center"/>
<mx:AdvancedDataGridColumn headerText="工装工时" dataField="gzgs" width="120" textAlign="center"/>
<mx:AdvancedDataGridColumn headerText="其他工时" dataField="qtgs" width="120" textAlign="center"/>
<mx:AdvancedDataGridColumn headerText="合计" dataField="hj" width="100" textAlign="center" />
</mx:AdvancedDataGridColumnGroup>

</mx:groupedColumns>
</mx:AdvancedDataGrid>

</mx:Canvas>

</mx:Application>



实例代码如上,拷贝即可运行,问题是如何实现按一次TAB键后校验完成第一个单元格后定位在第二个单元格中,现在的效果是按完一次TAB键后同时校验了两个单元格并且失去焦点,希望高手指点,困扰我好久!

[解决办法]
把这行代码注释掉就好了吧?

JScript code
if (val.type == "invalid")                    {                        event.preventDefault();                        if (newData.length != 0)                            callLater(maintainEdit, fCell);                    }                    else                    {//                        callLater(maintainFocus);                    } 

读书人网 >flex

热点推荐