【问题标题】:Flex Datagrid + Tab NavigatorFlex 数据网格 + 选项卡导航器
【发布时间】:2011-07-24 16:29:08
【问题描述】:

我有几个数据网格(从某些地图服务中检索数据)。

我想将这些数据网格放置在选项卡导航器的单独选项卡中。除了第一个选项卡始终没有任何数据网格结束之外,所有工作正常。

我尝试过创建 policy="all" 之类的东西,但第一个选项卡总是为空。有没有人知道为什么第一个标签总是空的。

任何解决方法。

谢谢

var box:HBox=new HBox();
var dg:DataGrid = new DataGrid();
dg.dataProvider = newAC;
box.label=title.text;
box.addChild(dg);
tabNaviId.addChild(box);
tabNaviId.selectedIndex=2;  
resultsArea.addChild(tabNaviId);

dg 是正在填充的数据网格。上面的代码在一个循环中,在每个循环中我都在创建一个 Hbox+datagrid。然后我将 Hbox 添加到导航器,最后将导航器添加到 resultsArea(这是一个画布)。

除了第一次,上面的代码效果很好。

我得到的最终结果是,有一个选项卡导航器,其中第一个选项卡没有任何数据网格,但其余选项卡都有数据网格。关于为什么会发生这种情况的任何想法。

调用了一个名为 createDatagrid 的函数:

dgCollection.addItem(parentApplication.resultsPanel.createDatagrid( token.name.toString() + " (" + recAC.length + " selected)", recAC, false, callsToMake ));

在另一个Mxml组件中存在这个函数

public function createDatagrid(titleText:String, recACAll:ArrayCollection, showContent:Boolean, callsToMake:Number):DataGrid
        {

            var dg:DataGrid = new DataGrid();
            var newAC:ArrayCollection = new ArrayCollection();
            var newDGCols:Array = new Array();

            for( var i:Number = 0; i < recACAll.length; i ++)
            {
                var contentStr:String = recACAll[i][CONTENT_FIELD];
                var featureGeo:Geometry = recACAll[i][GEOMETRY_FIELD];
                var iconPath:String = recACAll[i][ICON_FIELD];
                var linkStr:String = recACAll[i][LINK_FIELD];
                var linkNameStr:String = recACAll[i][LINK_NAME_FIELD];
                var featurePoint:MapPoint = recACAll[i][POINT_FIELD];
                var titleStr:String = recACAll[i][TITLE_FIELD];

                if( contentStr.length > 0)
                {
                    var rows:Array = contentStr.split("\n");

                    var tmpObj:Object = new Object();

                    if(!showContent)
                    {
                        for( var j:Number = 0; j < rows.length; j++)
                        {
                            var tmpStr:String = rows[j] as String;
                            var header:String = tmpStr.substring(0,tmpStr.indexOf(":"));
                            var val:String = tmpStr.substring(tmpStr.indexOf(":") + 2);
                            if(header.length > 0)
                            {
                                tmpObj[header] = val;
                                if(newDGCols.length < rows.length - 1)
                                {
                                    newDGCols.push( new DataGridColumn(header));
                                }
                            }
                        }
                    }
                    else
                    {
                        if(newDGCols.length == 0)
                        {
                            newDGCols.push(new DataGridColumn(CONTENT_FIELD));
                            newDGCols.push(new DataGridColumn(GEOMETRY_FIELD));
                            newDGCols.push(new DataGridColumn(ICON_FIELD));
                            newDGCols.push(new DataGridColumn(LINK_FIELD));
                            newDGCols.push(new DataGridColumn(LINK_NAME_FIELD));
                            newDGCols.push(new DataGridColumn(POINT_FIELD));
                            newDGCols.push(new DataGridColumn(TITLE_FIELD));
                        }
                    }

                    tmpObj[CONTENT_FIELD] = contentStr;
                    tmpObj[GEOMETRY_FIELD] = featureGeo;
                    tmpObj[ICON_FIELD] = iconPath;
                    tmpObj[LINK_FIELD] = linkStr;
                    tmpObj[LINK_NAME_FIELD] = linkNameStr;
                    tmpObj[POINT_FIELD] = featurePoint;
                    tmpObj[TITLE_FIELD] = titleStr;

                    newAC.addItem(tmpObj);
                }

                if( showHidePic.source == minSourceI )
                {
                    showHidePic.source = minSource;
                }
                else if( showHidePic.source == maxSourceI )
                {
                    showHidePic.source = maxSource;
                }
                curResults = curResults + recACAll.length;

                if (curResults == 1)
                {
                    showInfoWindow(tmpObj);

                    if(showContent)
                    {
                        parentApplication.maps.map.extent = featureGeo.extent;
                    }
                }
                else
                {
                    showInfoWindow(null);
                    // Added to avoid the overview button problem (needs checking)
                    this.removeEventListener(MouseEvent.MOUSE_OVER, handleMouseOver, false);
                    this.removeEventListener(MouseEvent.MOUSE_MOVE,handleMouseOver,false);
                    this.removeEventListener(MouseEvent.MOUSE_OUT,handleMouseOut,false);
                    this.removeEventListener(MouseEvent.MOUSE_DOWN,handleMouseDrag,false);
                    this.removeEventListener(MouseEvent.MOUSE_UP,handleMouseDragStop,false);
                    this.parent.removeEventListener(MouseEvent.MOUSE_MOVE,handleParentMove,false);
                    this.parent.removeEventListener(MouseEvent.MOUSE_UP,handleMouseDragStop2,false);
                    maximizePanel();
                }

            }

            dg.dataProvider = newAC;
            dg.columns = newDGCols;
            dg.rowCount = newAC.length;

            var totalDGCWidth:Number = 0;

            for( var m:Number = 0; m < dg.columns.length; m++)
            {
                var dgc2:DataGridColumn = dg.columns[m];

                /*if(dgc2.headerText.toUpperCase()==LINK_FIELD.toUpperCase()){

                //dgc.itemRenderer=new ClassFactory(CustomRenderer);
                dgc2.itemRenderer=new ClassFactory(CustomRenderer);
                }*/
                var dgcWidth2:Number = dgc2.headerText.length * CHAR_LENGTH;

                for( var l:Number = 0; l < newAC.length; l++)
                {
                    var row2:Object = newAC.getItemAt(l) as Object;
                    var rowVal2:String = row2[dgc2.headerText];

                    if( rowVal2 != null)
                    {
                        var tmpLength2:Number = rowVal2.length * CHAR_LENGTH;

                        if(tmpLength2 < CHAR_MAX_LENGTH)
                        {
                            if(tmpLength2 > dgcWidth2)
                            {
                                dgcWidth2 = tmpLength2;
                            }
                        }
                        else
                        {
                            dgcWidth2 = CHAR_MAX_LENGTH
                            break;
                        }
                    }

                }
                // Added by FT:to change the item renderer for link field


                if( dgc2.headerText == GEOMETRY_FIELD || dgc2.headerText == CONTENT_FIELD ||
                    dgc2.headerText == ICON_FIELD || dgc2.headerText == LINK_FIELD ||
                    dgc2.headerText == POINT_FIELD || dgc2.headerText == TITLE_FIELD ||
                    dgc2.headerText == LINK_NAME_FIELD)
                {
                    if(dgc2.headerText == CONTENT_FIELD && showContent)
                    {
                        //something
                    }
                    else
                    {

                        dgcWidth2 = 0;
                    }
                }

                totalDGCWidth += dgcWidth2;
            }

            dg.width = totalDGCWidth;



            for( var k:Number = 0; k < dg.columns.length; k++)
            {
                var dgc:DataGridColumn = dg.columns[k];
                var dgcWidth:Number = dgc.headerText.length * CHAR_LENGTH;
                for( var n:Number = 0; n < newAC.length; n++)
                {
                    var row:Object = newAC.getItemAt(n) as Object;
                    var rowVal:String = row[dgc.headerText];

                    if(rowVal != null)
                    {
                        var tmpLength:Number = rowVal.length * CHAR_LENGTH;

                        if(tmpLength < CHAR_MAX_LENGTH)
                        {
                            if(tmpLength > dgcWidth)
                            {
                                dgcWidth = tmpLength;
                            }
                        }
                        else
                        {
                            dgcWidth = CHAR_MAX_LENGTH
                            break;
                        }
                    }

                }
                if( dgc.headerText == GEOMETRY_FIELD || dgc.headerText == CONTENT_FIELD ||
                    dgc.headerText == ICON_FIELD || dgc.headerText == LINK_FIELD ||
                    dgc.headerText == POINT_FIELD || dgc.headerText == TITLE_FIELD ||
                    dgc.headerText == LINK_NAME_FIELD)
                {
                    if(dgc.headerText == CONTENT_FIELD && showContent)
                    {
                        dgc.visible = true;
                    }
                    else
                    {

                        dgc.visible = false;
                        dgcWidth = 0;
                    }
                }

                if( dgc.headerText == LINK_COL_NAME)
                {
                    dgcWidth = LINK_COL_WIDTH;
                }

                dgc.width = dgcWidth;
            }

            dg.addEventListener(ListEvent.ITEM_CLICK,rowClicked);
            dg.addEventListener(ListEvent.ITEM_ROLL_OVER,mouseOverRow);
            dg.addEventListener(ListEvent.ITEM_ROLL_OUT,mouseOutRow);

            var title:Text = new Text();
            title.text = titleText;
            title.setStyle("fontWeight","bold");

            //resultsArea.addChild(title);

            return dg;


            //tabNaviId.selectedIndex=2;    


        }
        public function populateGrid(dgCollection:ArrayCollection):void{


            for( var k:Number = 0; k < dgCollection.length; k++)
            {
                var box:HBox=new HBox();
                var dg2:DataGrid=dgCollection.getItemAt(k) as DataGrid;
                box.label="some";
                box.addChild(dg2);
                tabNaviId.addChild(box);

            }
            resultsArea.addChild(tabNaviId);
        }

标签导航器声明为

<mx:Image id="showHidePic" click="toggleResults()"/>
<mx:VBox y="20" styleName="ResultsArea" width="100%" height="100%">
    <mx:HBox>
        <mx:Button label="Export to Excel" click="downloadExcel()"/>
        <mx:Button label="Clear" click="clear()" />
    </mx:HBox>
    <mx:VBox id="resultsArea" styleName="ResultsContent" paddingTop="10" paddingLeft="10" paddingRight="10" verticalScrollPolicy="off" horizontalScrollPolicy="off">
        <mx:TabNavigator id="tabNaviId" width="622" height="274" creationPolicy="all">

        </mx:TabNavigator>

    </mx:VBox>
</mx:VBox>

【问题讨论】:

  • 张贴来源会很有用!没有它,我们将很难为您提供帮助。
  • 同意,请提供代码,不要使用creationPolicy="all"
  • 谢谢各位,代码请看原帖。
  • 是的,请添加示例
  • 弗洛里安,我已经在主帖中添加了代码。

标签: apache-flex datagrid


【解决方案1】:

Abstract,我们能否得到完整的代码,包括你提到的循环,以及你创建 TabNavigator 的代码?

TabNavigator 可能已经有一个初始子项,并且您正在创建的所有子项都在之后添加。

【讨论】:

  • 请立即查看帖子。我可以确认,数据不是问题,因为创建的数据网格确实包含正确的数据。只是第一个选项卡的第一个数据网格永远不会显示。
  • 任何人都可以弄清楚为什么没有生成第一个选项卡中的数据网格。
  • 更新:我第一次让它工作,但是第二次进入 createDataGrid 函数时,选项卡最终为空。
猜你喜欢
  • 2013-08-28
  • 2014-07-31
  • 2016-10-24
  • 2011-03-25
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
相关资源
最近更新 更多