Сетка данных нескольких компонентов в одном столбце - PullRequest
0 голосов
/ 24 июня 2009

Привет, я хотел спросить, есть ли возможность иметь как строки, так и радиокнопки в одном столбце, в зависимости от значения другого столбца, возможно

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

Если в столбце 1 в столбце 2 есть буква r, должна появиться радиокнопка, в противном случае в столбце 2 просто отображается строка.

Спасибо за ваши ответы

Себастьян

Ответы [ 2 ]

1 голос
/ 24 июня 2009

Вам нужно написать средство визуализации элементов, чтобы сделать это. Однако вы хотите обновлять состояние рендеринга всякий раз, когда установлено свойство «data». Это важно, поскольку средства визуализации предметов перерабатываются. В основном свойство data устанавливается каждый раз, когда изменяются данные для этого средства визуализации, и это происходит при прокрутке 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>
1 голос
/ 24 июня 2009

Вам нужно написать свой 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.
}
...