2

当我Alert.show在一个需要DataGridEvent.

执行时Alert.show,函数运行两次。

这是代码:

private function onItemEnd(event:DataGridEvent):void
{

    var pattern:RegExp =/[^a-z0-9A-ZéèçàêïôëËÉÊÈìíîïÌÍÎÏÇùúûü]/;
    var res:Boolean=pattern.test(texteSaisi);
    if(res==true){
        event.reason = DataGridEventReason.CANCELLED; 
        Alert.show("Le nom de l'option ne doit pas contenir des caractère spéciaux."); 
    }else{ 
        if (event.dataField == "libelle"){
            question.libelle = texteSaisi;
        }else if (event.dataField == "description") {
            question.description = texteSaisi;
        }

<mx:DataGrid 
    draggableColumns="false" 
    dataProvider = "{model.obtenirListeOptionsTarificationProposition}" 
    id = "gridOptions"
    rowCount = "10" 
    doubleClickEnabled = "true"
    itemClick = "onItemClick(event)" 
    change = "onChange(event)"
    width = "80%" 
    editable = "true"
    itemEditEnd = "onItemEnd(event)">

调用此函数时,屏幕上有两个警报,我不知道为什么。

4

2 回答 2

2

我怀疑将警报与itemEditEnd事件结合使用是有问题的。写了一个简单的测试用例,它的行为不同(我的似乎进入了一个无限循环)。

问题是这样的:

  1. itemEditEnd事件可以通过多种方式分派:键盘交互(在编辑单元格时按 Tab 键或按 Enter)、鼠标交互等。

  2. 我开始编辑一个单元格。然后我点击选项卡/输入或单击另一个单元格。这会生成itemEditEnd事件并将焦点移动到新的可编辑单元格。

  3. 在事件的事件处理程序中itemEditEndAlert显示一个。此弹出窗口会从该可编辑单元格中移除焦点......从而调度第二个itemEditEnd事件。

在下面的测试应用程序中,我实际上创建了一个无限循环。

如果您需要在事件发生后显示警报itemEditEnd,也许您可​​以在事件处理程序中放置一些逻辑(以便第二次立即返回)。

<?xml version="1.0" encoding="utf-8"?>
<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"
               creationComplete="onCreationComplete()">

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.controls.Alert;

            private function onCreationComplete():void
            {
                grid.dataProvider=createCollection();
            }


            private function createCollection():ArrayCollection
            {
                var tmp:Array = [];
                for (var i:int = 1; i<11; i++)
                {
                    tmp.push({ data: Math.random()*100, label: i.toString() + " label" });
                }
                return new ArrayCollection(tmp);
            }

            private function onItemEditEnd():void
            {
                Alert.show("item edit end");
            }

        ]]>
    </fx:Script>

    <mx:DataGrid id="grid" itemEditEnd="onItemEditEnd()" editable="true" />

</s:Application>
于 2012-06-15T21:47:50.397 回答
0

我通过在第一次触发警报时将布尔值设置为 true 来解决此问题,然后如果用户尝试更改 onter 行中的另一个项目,我在 on click 处理程序中将其设置为 false。

谢谢你的帮助;)

于 2012-06-18T13:34:13.983 回答