StackOverflowError в определенных пределах строки DataGrid в NumericStepper - PullRequest
1 голос
/ 01 октября 2010

У меня есть DataGrid с NumericStepper в качестве редактора элементов для одного из столбцов. Предполагается, что числовой шагер получает свои максимальные и минимальные значения из данных для каждой строки. Мой MXML такой:

<mx:DataGrid x="0" y="45" width="272" height="525" dataProvider="{dp}" variableRowHeight="true" editable="true" id="equipmentDG" verticalAlign="middle">                
    <mx:columns>                                        
        <mx:DataGridColumn headerText="Benämning" headerStyleName="gridheader" fontSize="12" width="128" dataField="name" editable="false"/>
        <mx:DataGridColumn headerText="Antal" headerStyleName="gridheader" width="40" dataField="antal" editorDataField="value" editable="true">
            <mx:itemEditor>
                <fx:Component>
                    <mx:NumericStepper minimum="data.minNo" maximum="data.maxNo" stepSize="1" width="35" height="20"></mx:NumericStepper>               
                </fx:Component>
            </mx:itemEditor>
        </mx:DataGridColumn>
    </mx:columns>
</mx:DataGrid>

Проблема в том, что после запуска приложения и щелчка по ячейке я получаю StackOverflowError после нескольких других ошибок. Последние строки трассировки стека, которые я получаю (до того, как они начнут повторяться):

    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at mx.core::UIComponent/dispatchEvent()[E:\dev\4.x\frameworks\projects\framework\src\mx\core\UIComponent.as:12528]
    at mx.controls::NumericStepper/set data()[E:\dev\4.x\frameworks\projects\framework\src\mx\controls\NumericStepper.as:629]
    at mx.controls::NumericStepper/get data()[E:\dev\4.x\frameworks\projects\framework\src\mx\controls\NumericStepper.as:611]
    at Function/()[/Users/lisbeth/Documents/Development/Typkatalog/DevelopmentBranch/src/planeringsverktyg/dialogs/TentInfo.mxml:267]
    at Function/http://adobe.com/AS3/2006/builtin::apply()
    at mx.binding::PropertyWatcher/updateProperty()[E:\dev\4.x\frameworks\projects\framework\src\mx\binding\PropertyWatcher.as:334]
    at Function/http://adobe.com/AS3/2006/builtin::apply()
    at mx.binding::Watcher/wrapUpdate()[E:\dev\4.x\frameworks\projects\framework\src\mx\binding\Watcher.as:192]
    at mx.binding::PropertyWatcher/eventHandler()[E:\dev\4.x\frameworks\projects\framework\src\mx\binding\PropertyWatcher.as:375]

Есть идеи?

1 Ответ

2 голосов
/ 01 октября 2010

Ну, похоже, что привязка minimum и maximum к данным приводит к бесконечному циклу. Однако вам не нужно связывать, чтобы изменить эти два значения для каждой строки в вашей DataGrid. Переопределение сеттера для data поможет. Смотрите следующий пример:

<?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"
               xmlns:local="*">
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;

            [Bindable]
            private var dp:ArrayCollection = new ArrayCollection([
                {name: "Name 1", antal: 1, minNo: 1, maxNo: 5},
                {name: "Name 2", antal: 2, minNo: 1, maxNo: 6},
                {name: "Name 3", antal: 3, minNo: 1, maxNo: 7}
                ]);
        ]]>
    </fx:Script>

    <mx:DataGrid x="0" y="45" width="272" height="525" dataProvider="{dp}" variableRowHeight="true"
                 editable="true" id="equipmentDG" verticalAlign="middle">
        <mx:columns>
            <mx:DataGridColumn headerText="Benämning" headerStyleName="gridheader" fontSize="12"
                               width="128" dataField="name" editable="false"/>
            <mx:DataGridColumn headerText="Antal" headerStyleName="gridheader" width="40"
                               dataField="antal" editorDataField="value" editable="true">
                <mx:itemEditor>
                    <fx:Component>
                        <mx:NumericStepper stepSize="1" width="35" height="20">
                            <fx:Script>
                                <![CDATA[
                                    override public function set data(value:Object):void
                                    {
                                        super.data = value;

                                        if (value && value.hasOwnProperty("minNo"))
                                            minimum = value.minNo;

                                        if (value && value.hasOwnProperty("maxNo"))
                                            maximum = value.maxNo;
                                    }
                                ]]>
                            </fx:Script>
                        </mx:NumericStepper>
                    </fx:Component>
                </mx:itemEditor>
            </mx:DataGridColumn>
        </mx:columns>
    </mx:DataGrid>
</s:Application>

Существуют явные проверки, существуют ли поля minNo и maxNo, поскольку каким-то образом метод вызова вызывается довольно часто и большую часть времени value не является ожидаемым объектом ...

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