【问题标题】:Re-rendering a DataGrid重新渲染 DataGrid
【发布时间】:2011-08-30 22:28:28
【问题描述】:

我在自定义组件中有一个数据网格。此 DG 接受嵌套对象作为其数据提供者,因此我的数据网格呈现如下:

<mx:DataGrid id="privilegesDG" dataProvider="{privArray}" width="100%" variableRowHeight="true">
        <mx:columns>
            <mx:DataGridColumn dataField="Name" />
            <mx:DataGridColumn dataField="Alias" />
            <mx:DataGridColumn headerText="Roles Assigned" dataField="roles">
                <mx:itemRenderer>
                    <fx:Component>
                        <mx:VBox creationComplete="box1_creationCompleteHandler(event)">
                            <fx:Script>
                                <![CDATA[
                                    import com.pm.modules.events.UpdateDBEvent;

                                    import mx.containers.HBox;
                                    import mx.controls.Label;
                                    import mx.controls.LinkButton;
                                    import mx.events.FlexEvent;

                                    [Bindable]private var prID:int;
                                    protected function box1_creationCompleteHandler(event:FlexEvent):void
                                    {
                                        for each(var temp:Object in data.roles){
                                            prID = temp.rid;
                                            var hgrp:HBox = new HBox();
                                            hgrp.autoLayout = false;

                                            var lbl:Label = new Label();
                                            lbl.text = temp.rname;

                                            var lb:LinkButton = new LinkButton();
                                            lb.label = 'X';
                                            lb.focusEnabled = true;
                                            lb.addEventListener(MouseEvent.CLICK,handleClick);

                                            hgrp.addElement(lbl);
                                            hgrp.addElement(lb);

                                            this.addElement(hgrp);
                                        }
                                    }

                                    protected function handleClick(event:MouseEvent):void{
                                        dispatchEvent(new UpdateDBEvent(UpdateDBEvent.ON_DELETE_PRIVILEGE_ROLE_MAP,0,0,0,prID,0,true));
                                    }
                                ]]>
                            </fx:Script>
                        </mx:VBox>
                    </fx:Component>
                </mx:itemRenderer>
            </mx:DataGridColumn>
        </mx:columns>
    </mx:DataGrid>

所以我有一个显示嵌套数据的内联 itemrenderer。现在每次发生更新操作时,我都会调用一个函数来重新填充这个数据网格。但是使用嵌套数据 dsnt 填充的列显示任何内容...

我在网上搜索,发现我可能需要为这个组件调用updateDisplayList函数?

所以我尝试了这样的事情:

override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{
            super.updateDisplayList(unscaledWidth,unscaledHeight);
        }


        protected function handleResult(event:ResultEvent):void{
            if(event.result.toString() == 'false')
                Alert.show("Could not perform operation");
            else{
                RO.getPrivilegesAndRoles(); //re-populates DG
                invalidateDisplayList();
            }
        }

我真的不知道我应该在那个函数里面放什么。我应该调用 updateDisplayList 中的重新填充函数吗?我试过了,但它不起作用......

【问题讨论】:

    标签: datagrid flex4


    【解决方案1】:

    项目渲染器的creationComplete 事件仅在初始化时发生一次。只要项目渲染器正在回收,新数据就不会填充到您的项目渲染器中。

    你可以通过两种方式解决:

    1. 创建 MXML 项呈现器。至于它的基类是VBox,它是这里的最佳选择。因此,您可以摆脱数据绑定以自动填充数据更改。要填充所有角色,请使用 Repeater 组件,而不是使用 {data.roles} 作为数据提供者的循环。
    2. 第二个选项是使用 ActionScript 并将UIComponent 作为基类。在这种情况下,您应该覆盖override public function set data(value:Object):void 并从那里调用invalidateDisplayList(),直到订阅data.roles 的collectionChange 事件并从更改处理程序中调用invalidateDisplayList()。然后在updateDisplayList() 中,您应该循环数据并创建/填充所有控件。第二个选项可以为您提供更好的性能,但对于新手来说这不是一个好方法。

    所以我建议你使用 MXML 版本的绑定。

    【讨论】:

    • 我不能使用Repeater的原因是因为data.roles是一个数组数组并且它有动态索引......即角色的数量不同...... data[roles][0] => array(),data[roles][1]=>array() .. 可能有 0 或 n 个角色.. 我必须使用 for 循环来访问这个数组.. 你能详细说明你的第二个选项吗?我是一个新手,但也许你可以给我看一些代码示例..?任何帮助都将不胜感激.. :)
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2018-08-12
    • 2019-06-01
    相关资源
    最近更新 更多