Значение, отредактированное в TextInput, сворачивается при прокрутке, которое используется как itemRenderer в DataGrid - PullRequest
0 голосов
/ 25 марта 2011

У меня есть две сетки данных 1. ОПЦИОННАЯ СЕТКА и 2. ИЗБИРАТЕЛЬНАЯ СЕТКА.Я использовал VBox контейнер как itemRenderer в ELECTION GRID, который состоит из TextInput в столбце Description.Ниже приведен пример SWF.

Всякий раз, когда в ОПЦИОННОЙ СЕТКЕ установлен флажок, я должен добавить соответствующий текстовый ввод со значением описания во 2-й сетке (СЕТКА ВЫБОРОВ) для всех строк.Предположим, если выбраны два флажка, я должен добавить два ввода текста во 2-й сетке и так далее ... Это работает нормально.Но всякий раз, когда я редактирую ввод текста и прокручиваю вверх или вниз, значение сворачивается между строками или исчезает.Я подозреваю, что itemRenderers будет повторно использоваться для других строк при прокрутке.Как сохранить отредактированное значение в textinput?

Ниже приведен код.

Основной код:

<mx:VBox width="100%" height="100%">
    <mx:Label text="OPTION GRID :" fontSize="12" fontStyle="normal" fontThickness="15"/>        
    <components:CAEventDetailDataGrid width="100%" height="20%" dataProvider="{optionData}" allowMultipleSelection="true" optionSelected="onOptionSelection(event)">        
        <components:columns>
            <mx:DataGridColumn dataField="selected" headerText="Select All" itemRenderer="renderer.CheckBoxItemRenderer" width="70" textAlign="center"/>
            <mx:DataGridColumn dataField="optionId" headerText="Option" textAlign="left"/>
            <mx:DataGridColumn dataField="option" headerText="Description" textAlign="left"/>
        </components:columns>       
    </components:CAEventDetailDataGrid>
    <mx:Label text="ELECTION GRID :" fontSize="12" fontStyle="normal" fontThickness="15"/>
    <mx:DataGrid id="electionGrid" width="100%" height="30%" dataProvider="{electionSummary}" rowCount="3" verticalScrollPolicy="on" variableRowHeight="true">                      
        <mx:columns>
            <mx:DataGridColumn dataField="dbProduct" headerText="DB Product"/>
            <mx:DataGridColumn dataField="entitledQty" headerText="Entitled Quantity"/>
            <mx:DataGridColumn dataField="entityId" headerText="Entity Id"/>
            <mx:DataGridColumn dataField="entityName" headerText="Entity Name"/>
            <mx:DataGridColumn dataField="eventStatus" headerText="Event Status"/>              
            <mx:DataGridColumn dataField="option" headerText="Description" itemRenderer="renderer.TextInputRenderer"/>            
        </mx:columns>                   
    </mx:DataGrid>
</mx:VBox>

<mx:Script>
    <![CDATA[
        import event.ElectionEvent;


        private function onOptionSelection(electionEvent : ElectionEvent) : void
        {       
            electionGrid.dispatchEvent(new ElectionEvent(ElectionEvent.OPTION_SELECTED,electionEvent.item));
        }

    ]]>
</mx:Script>

TextInputRenderer:

public class TextInputRenderer extends VBox

override public function set data(value:Object):void
    {
        _data = value;          
        _dataGrid = owner as DataGrid;
        if(_dataGrid)
            _dataGrid.addEventListener(ElectionEvent.OPTION_SELECTED,addTextInput);
    }

    private function addTextInput(electionEvent : ElectionEvent) : void
    {   
        var option : CAEventOption = electionEvent.item as CAEventOption;

        if(option != null)
        {   
            var textInput : TextInput = getChildByName(option.option) as TextInput;

            if(textInput == null)
            {
                textInput = new TextInput;
                textInput.name = option.option;                 
                textInput.text = option.option;                 
                textInput.percentWidth = 100;
                textInput.percentHeight = 100;
                textInput.visible = textInput.includeInLayout = option.selected;
                addChild(textInput);
            }
            else
            {
                textInput.visible = textInput.includeInLayout = option.selected;
            }
        }
    }

Событие Election - это настраиваемое событие, которое будет запускаться и вызывать функцию слушателя addTextInput всякий раз, когда в OPTION GRID установлен / снят флажок.

private function addTextInput(electionEvent : ElectionEvent) : void

Способ сохранить измененное значение в TextInput?Может у кого-нибудь есть решение?

1 Ответ

1 голос
/ 25 марта 2011

Я подозреваю, что itemRenderers повторно использовать для других строк, пока прокрутки. Как сохранить отредактированный значение в текстовом поле

Исправьте всю цель itemRenderer в том, что он используется повторно при прокрутке класса, основанного на списке. Вместо рендеринга всех сотен предметов в вашем классе, он просто отобразит 4-10 (или что угодно), которые вы отображаете; и повторно использовать эти DisplayObject при прокрутке.

Ваш код выглядит так, как будто вы добавляете новый TextInput к одному itemRenderer, но трудно сказать. Вы забыли включить ссылку на ваше приложение.

Как сохранить отредактированное значение в textinput?

Обычно вы сохраняете значение в dataProvider объекта; не меняйте его на основании какого-либо внешнего события. поэтому, когда вы используете метод onItemSelect, вы добавляете элемент ко 2-м данным DataGrid, который, в свою очередь, создает newRenderer, который должен иметь возможность «создавать себя» через свойство data этого рендерера.

...