【问题标题】:Value edited in TextInput gets collapsed while scrolling which is used as itemRenderer in DataGrid在 TextInput 中编辑的值在滚动时折叠,用作 DataGrid 中的 itemRenderer
【发布时间】:2011-07-22 17:57:13
【问题描述】:

我有两个数据网格 1. OPTION GRID 和 2. ELECTION GRID。我在 ELECTION GRID 中使用 VBox 容器作为 itemRenderer,它由描述列中的 TextInput 组成。以下是示例 SWF。

每当在 OPTION GRID 中选中复选框时,我必须在所有行的第二个网格(ELECTION GRID)中添加一个带有描述值的相应文本输入。假设如果选择了两个复选框,我必须在第二个网格中添加两个文本输入,依此类推......这工作正常。但是,每当我编辑文本输入并向上或向下滚动时,该值就会在行之间折叠或消失。 我怀疑 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>

文本输入渲染器:

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;
            }
        }
    }

选举事件是一个自定义事件,只要在 OPTION GRID 中选中/取消选中复选框,就会触发并调用监听函数 addTextInput。

private function addTextInput(electionEvent : ElectionEvent) : void

他们是在 TextInput 中保留编辑值的一种方式吗?谁能有解决办法?

【问题讨论】:

    标签: apache-flex datagrid itemrenderer textinput


    【解决方案1】:

    我怀疑 itemRenderers 会 被重新用于其他行,而 滚动。如何保留已编辑的 文本输入中的值

    更正 itemRenderer 的全部目的是在您滚动浏览基于列表的类时重用它。它不会渲染您班级中的所有数百个项目,而只会渲染您正在显示的 4-10(或其他);并在滚动时重新使用那些 DisplayObject。

    您的代码看起来像是在向单个 itemRenderer 添加新的 TextInput,但很难说。您忘记包含指向您的应用程序的链接。

    如何将编辑后的值保留在 文本输入?

    通常您将值存储在对象的 dataProvider 中;不要根据一些外部事件来改变它。因此,在您的“onItemSelect”方法中,您将向第二个 DataGrid 的数据添加一个项目,这将创建一个 newRenderer,它应该能够通过该渲染器的 data 属性“创建自己”。

    【讨论】:

    • 我已经修改了TextInputRenderer.as中的set data方法来显示编辑后的文本。
    • @Eswaran 这解决了你的问题吗?或者帮助解决您的问题?
    猜你喜欢
    • 2011-05-17
    • 1970-01-01
    • 2016-10-10
    • 2014-04-09
    • 2017-12-05
    • 2012-03-10
    • 1970-01-01
    • 2015-11-17
    • 2012-08-21
    相关资源
    最近更新 更多