Динамически добавить столбец данных DataGrid - PullRequest
0 голосов
/ 28 декабря 2011

Ребята, я получил dataColumn, уже определенный как

<mx:DataGridColumn headerText="Role" id="roleAdmin"  headerStyleName="myHeaderStyles">
        <mx:itemRenderer>
                <fx:Component>
                        <mx:VBox>
                                <mx:Text width="100%" text="{(data.role == 0)? 'Super Admin':((data.role == 1)? 'Admin': ((data.role == 2)? 'Regular User': 'Unknown'))}"/>
                        </mx:VBox>
                </fx:Component>
        </mx:itemRenderer>
</mx:DataGridColumn>

Все, что я хочу сделать, - это динамически создавать эти данные в зависимости от условий, которые я поставил. Любой может помочь мне с кодом, который яи как я могу добавить все эти вещи.

С наилучшими пожеланиями

Ответы [ 2 ]

5 голосов
/ 28 декабря 2011

Попробуй это. Вы получите логику обработки динамических столбцов с помощью средства визуализации элементов.

var cols:Array=new Array();
cols = dgDatagrid.columns;
var column:DataGridColumn = new DataGridColumn();
column.headerText = "Role";
column.width=170;
column.dataField="role";
column.setStyle('headerStyleName',myHeaderStyles);
column.itemRenderer = new ClassFactory(MyRenderer);  
cols.push(column);
dgDatagrid.columns=cols;

MyRenderer:

<?xml version="1.0" encoding="utf-8"?>
<s:MXDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx" 
         >

    <s:layout>
        <s:HorizontalLayout paddingLeft="10" paddingRight="10" />
    </s:layout>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
    import mx.controls.DataGrid;
            import mx.controls.dataGridClasses.DataGridListData;
            import mx.events.FlexEvent;

            import spark.events.TextOperationEvent;

            private var dg:DataGrid;
            private var dglistData:DataGridListData;


            override public function set data( value:Object ) : void 
            {
                super.data = value;
                if(value){
                    dglistData = listData as DataGridListData;
                    if(value[dglistData.dataField]){
txtText.text=((value[dglistData.dataField]) == 0)? 'Super Admin':(((value[dglistData.dataField]) == 1)? 'Admin': (((value[dglistData.dataField]) == 2)? 'Regular User': 'Unknown'))

                        }
                                            }
            }
]]>
</fx:Script>

<mx:VBox>
<mx:Text width="100%" id="txtText"/>
 </mx:VBox>
</s:MXDataGridItemRenderer>
1 голос
/ 28 декабря 2011

Вам вообще не нужен пользовательский элементендер. Это классический пример использования labelFunction.

Сначала напишите функцию метки следующим образом:

private function roleLabelFunction(data:Object, column:DataGridColumn):String {
    switch(data.role) {
        case 0: return 'Super Admin';
        case 1: return 'Admin';
        case 2: return 'Regular User';
        default: return 'Unknown';
    }
    //Some flex compilers show a compiler error if there is no return in the main function body, so this is the same as the default case
    return 'Unknown';
}

Затем используйте это как labelFunction вашей таблицы данных

<mx:DataGridColumn headerText="Role" id="roleAdmin"  headerStyleName="myHeaderStyles" labelFunction="roleLabelFunction">
...