【问题标题】:FLEX DataGrid Column ModificationFLEX DataGrid 列修改
【发布时间】:2012-06-17 22:22:03
【问题描述】:

我是 Flex 的新手。我想以附加的网格格式显示数据。我找到了在 DataGrid 中显示的最佳方式。但是 CIs 列有多个条目,因此其他列会重复。我想避免其他列中的重复数据。随附的屏幕截图是 excel,我想在 Flex 中实现相同的格式。我正在使用 Flex 4.5

【问题讨论】:

    标签: actionscript-3 apache-flex flex4 flex4.5


    【解决方案1】:

    您可以通过以下代码获得一些想法...您可以使用以下概念为您的实现构建逻辑。以下示例是根据您的要求不完整的示例:-

    <?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">
        <fx:Declarations>
            <!-- Place non-visual elements (e.g., services, value objects) here -->
        </fx:Declarations>
        <fx:Script>
            <![CDATA[
                import mx.collections.ArrayCollection;
                import mx.core.UIComponent;
                import mx.events.AdvancedDataGridEvent;
                import mx.events.ListEvent;
    
                [Bindable]
                private var dpHierarchy:ArrayCollection= new ArrayCollection
                    ([
                        {name:"Barbara Jennings", address: "Arizona", contact:999970, orders:["1"]},
                        {name:"Dana Binn", address: "Arizona", contact:9999130, orders:["2"]},
                        {name:"Joe Smith", address: "California", contact:9992929, orders:["3"]},
                        {name:"Alice Treu", address: "California", contact:9999230, orders:["4"]}
                    ]);                    
    
                private function addOrder():void
                {
                    for(var i:int = 0 ; i < dpHierarchy.length; i++)
                    {
                        if(dropDownID.selectedItem.name == dpHierarchy[i].name)
                        {
                            var itemUpdated:Array = dpHierarchy[i].orders;
                            itemUpdated.push(orderNumber.text);
                            dpHierarchy[i].orders = itemUpdated;
                            dpHierarchy.itemUpdated(dpHierarchy[i]);
                            break;
                        }
                    }
                }
    
            ]]>
        </fx:Script>
        <mx:VBox x="30" y="30" width="450" height="400">
            <s:HGroup>
                <s:Button label="Add Order" click="addOrder()"/>
                <s:DropDownList id="dropDownID" dataProvider="{dpHierarchy}" labelField="name" selectedIndex="0"/>
                <s:TextInput id="orderNumber" width="100"/>
            </s:HGroup>
            <mx:AdvancedDataGrid id="myADG"   
                                 dataProvider="{dpHierarchy}"
                                 variableRowHeight="true" wordWrap="true">
                <mx:columns>
                    <mx:AdvancedDataGridColumn dataField="name" headerText="Name"/>
                    <mx:AdvancedDataGridColumn dataField="address" headerText="Address"/>
                    <mx:AdvancedDataGridColumn dataField="contact" headerText="Contact"/>
                    <mx:AdvancedDataGridColumn dataField="orders" headerText="Orders" itemRenderer="OrderItemRenderer"/>
    
                </mx:columns>   
            </mx:AdvancedDataGrid>
        </mx:VBox>  
    </s:Application>
    

    项目重新渲染器名称: - OrderItemRenderer

    <?xml version="1.0" encoding="utf-8"?>
    <s:MXAdvancedDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
                                      xmlns:s="library://ns.adobe.com/flex/spark" 
                                      xmlns:mx="library://ns.adobe.com/flex/mx" 
                                      focusEnabled="true" width="90%" height="90%">
        <fx:Script>
            <![CDATA[
                import mx.collections.ArrayCollection;
    
                [Bindable]
                private var initDG:ArrayCollection = new ArrayCollection();
    
                override public function set data(value:Object):void
                {
                    super.data = value;
                    initDG = new ArrayCollection(value.orders)
                }
            ]]>
        </fx:Script>
        <mx:DataGrid id="dataGrid" dataProvider="{initDG}" headerHeight="0" rowCount="{initDG.length}"/>
    </s:MXAdvancedDataGridItemRenderer>
    

    【讨论】:

      【解决方案2】:

      我认为做你想做的最好的方法是为 CLS 列创建一个自定义项呈现器,并将它呈现为一个列表控件。这样一来,每一行的 CLS 项将只占一行,而不是多行。

      【讨论】:

      • 这是一个很好的调用,只需要设置数据,以便 dataprovider 中数据元素的属性之一并随后传递到渲染器应该包含 CI 的列表/数组按其他列分组以获得列表
      • 感谢 Dom,但我的目标是以附加快照格式实现的。我附上的快照不包括在内。让我重新表述一下我的 Q。我想显示“姓名”、“地址”、“联系人”和“订单”。现在一个人可以下 N 个订单,因此在订单字段中,他们将是一个多条目。我想以网格格式显示所有详细信息,同时我想避免“姓名”、“地址”、“联系人”的重复行。
      • 我的示例仍然可以正常工作,但在将数据放入数据网格之前,您需要做更多的工作。从您的 dataProvider 中,将第一个元素添加到 arrayCollection。然后在dataProvider的后续记录上,检查名称是否已经在你的arrayCollection中。如果是,只需将他们的订单添加到主 arrayCollection 内的订单 arrayCollection。这将产生一个包含人员、他们的地址和联系人的 arrayCollection,并且每个人将拥有一个带有他们的 orderNumbers 的 arrayCollection。希望这是有道理的。
      猜你喜欢
      • 1970-01-01
      • 2010-11-20
      • 2015-06-19
      • 1970-01-01
      • 2010-11-03
      • 2011-04-09
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多