datagrid一列中的多个组件

时间:2009-06-24 08:08:12

标签: flex flash actionscript-3 datagrid

您好我想问是否有可能在一列中包含字符串和单选按钮,具体取决于另一列的值

|column1 | column 2   | 
|r       | radiobutton|
|s       | string     |

如果column2中的第1列中的r应该显示为radiobutton,否则第2列只显示一个字符串。

感谢您的回答

塞巴斯蒂安

2 个答案:

答案 0 :(得分:1)

您需要编写自己的itemRenderer。

从高级别开始,您需要做的是告诉列您将按行呈现列。然后,每行 - 你检查你需要的条件(比如查看不同的列或其他)并采取你想要的动作(比如添加单选按钮和其他组件)。

在数据栏中执行以下操作:

<mx:DataGridColumn id="yourColumn" 
headerText="Cool Column" editable="false" itemRenderer="SpecialCanvas"/>

然后在名为'SpecialCanvas'的组件中(假设他扩展了画布),您可以根据需要设置事件或覆盖方法...例如:

override protected function initializationComplete():void
{
  // check for the conditional that you want and add the component that
  // you need to this canvas or what not.
}

答案 1 :(得分:1)

您需要编写项目渲染器才能执行此操作。但是,只要设置了“data”属性,就要更新渲染的状态。这很重要,因为项目渲染器可以回收利用。基本上,只要该渲染器的数据发生更改,就会设置data属性,并在滚动DataGrid时发生这种情况。

这是一个使用DataGrid的简单应用程序:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="onCreationComplete()">

<mx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;

        [Bindable] private var collection:ArrayCollection;

        private function onCreationComplete():void
        {
            collection = new ArrayCollection();
            for (var i:uint = 0; i < 20; i++)
                collection.addItem({name:'Person #'+i});
        }

    ]]>
</mx:Script>

<mx:DataGrid width="600" dataProvider="{collection}" rowCount="5">
    <mx:columns>
        <mx:DataGridColumn itemRenderer="com.foo.ItemRenderer"/>
    </mx:columns>
</mx:DataGrid>

</mx:Application>

一个简单的基于MXML的渲染器:

<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml">

<mx:Script>
    <![CDATA[

        override public function set data(value:Object):void
        {
            super.data = value;
            // only show radio buttons if the "name" property of the data contains "5"; otherwise show a label
            radioS.visible = radioS.includeInLayout = radioM.visible = radioM.includeInLayout = radioL.visible = radioL.includeInLayout = data.name.indexOf(5) > -1;
            labelName.visible = labelName.includeInLayout = data.name.indexOf(5) < 0;               
        }

    ]]>
</mx:Script>

<mx:Label id="labelName" text="{data.name}"/>
<mx:RadioButton id="radioS" label="Small" groupName="radioGroup"/>
<mx:RadioButton id="radioM" label="Medium" groupName="radioGroup"/>
<mx:RadioButton id="radioL" label="Large" groupName="radioGroup"/>

</mx:HBox>