DataGrid.columns returns a copy of the columns array. Be sure you re-assign the modified array to the columns property.
Tracy Spratt, Lariat Services, development services available _____ From: flexcoders@yahoogroups.com [mailto:flexcod...@yahoogroups.com] On Behalf Of invertedspear Sent: Monday, December 14, 2009 10:20 AM To: flexcoders@yahoogroups.com Subject: [SPAM] [flexcoders] Re: Crazy problem with a script creating datagrids The problem is I have to create them programatically since the number of them will be different based on the returned data. I found a workaround where I call the filter after I assign the column dataFields names I want. But I'm still doing all these actions on an array that starts off with all the wrong values. --- In flexcod...@yahoogro <mailto:flexcoders%40yahoogroups.com> ups.com, Alex Harui <aha...@...> wrote: > > In general, you should manipulate the columns of a DataGrid at setup other than maybe to change visible. The recommended practice at setup is to create a fresh array of DataGridColumns and assign the whole array to the columns property. > > Alex Harui > Flex SDK Developer > Adobe Systems Inc.<http://www.adobe. <http://www.adobe.com/> com/> > Blog: http://blogs. <http://blogs.adobe.com/aharui> adobe.com/aharui > > From: flexcod...@yahoogro <mailto:flexcoders%40yahoogroups.com> ups.com [mailto:flexcod...@yahoogro <mailto:flexcoders%40yahoogroups.com> ups.com] On Behalf Of invertedspear > Sent: Friday, December 11, 2009 2:51 PM > To: flexcod...@yahoogro <mailto:flexcoders%40yahoogroups.com> ups.com > Subject: [flexcoders] Crazy problem with a script creating datagrids > > > > > This is driving me nuts. This script is adding datagrids to various containers in an accordion. In my first level for-each loop the item that fills my "if(compone...@component_componentid == "999999999")" is the last item looped through everything works fine except the datagrid I am building there has the wrong columns. For some reason "tempGridicd9.columns" array is returning the columns array from the tempGrid variable, and not even the version I end up with after the filter, but the original columns array. I don't even see how this is possible. > > Then when they datagrid gets drawn it has the right data in it, but it has extra columns, cause the items from the else statement have 4 more columns. > > I have done hours of trouble shooting on this so far. The problem will not present itself if I do not assign a dataProvider to tempGrid, for some reason that seems to be where it all blows up. > > Anyone have a clue what's going on? Either I've majorly screwed up or this is a major bug. Please help!! > > Here's a simple example of the XML, the real thing has a lot more nodes and a lot of attributes: > > <component> > <question> > <answer/> > </question> > </component> > <component> > <icd9/> > </component> > > Script With the Problem > > public function populateTemplate():void{ > accComponents.removeAllChildren(); > for each(var component:XML in XMLTemplate.template.children()){ > var newVBox:VBox = new VBox(); > newVBox.id = compone...@component_name; > newVBox.label = compone...@component_longname; > newVBox.width = 388; > newVBox.percentHeight = 100; > accComponents.addChild(newVBox); > > if(compone...@component_componentid == "999999999"){//icd9component > var tempGridicd9:DataGrid = new DataGrid(); > tempGridicd9.setStyle("borderStyle","none"); > tempGridicd9.dataProvider = component.children(); > tempGridicd9.validateNow(); > //tempGridicd9.columns = tempGridicd9.columns.filter(newTempGridicd9ColFilter); > tempGridicd9.id = 'gridICD9'; > tempGridicd9.headerHeight = 0; > tempGridicd9.selectable = false; > tempGridicd9.percentWidth = 100; > tempGridicd9.percentHeight = 100; > tempGridicd9.variableRowHeight = true; > tempGridicd9.columns[0].dataField = "@icd9_color"; > tempGridicd9.columns[0].width = 25; > tempGridicd9.columns[0].itemRenderer = new ClassFactory(icdDot); > tempGridicd9.columns[1].dataField = "@icd9_icd9"; > tempGridicd9.columns[1].width = 60; > tempGridicd9.columns[2].dataField = "@templateIcd9_name"; > tempGridicd9.columns[2].width = 283; > tempGridicd9.columns[2].wordWrap = true; > tempGridicd9.columns[3].dataField = "@templateIcd9_templateIcd9ID"; > tempGridicd9.columns[3].visible = false; > > newVBox.addChild(tempGridicd9); > }else if(component.children().length()>0){ > for each (var section:XML in component.children()){ > var newPanel:Panel = new Panel(); > newPanel.title = secti...@sectiontype_name + ": " + secti...@section_name; > newPanel.width = 368; > newPanel.id = secti...@section_sectionid; > newPanel.data = secti...@section_sortorder; > newPanel.addEventListener(MouseEvent.CLICK,panelClick,false,100,false); > newPanel.addEventListener(MouseEvent.MOUSE_OVER,sectMouseOver,false,100,fals e); > newPanel.addEventListener(MouseEvent.MOUSE_OUT,sectMouseOut,false,100,false) ; > newVBox.addChild(newPanel); > > if(section.children().length()>0){ > var tempGrid:DataGrid = new DataGrid(); > var tempGridList:XMLList = section.children(); > tempGridList = tempGridList.(@questionType_name!="null"); > tempGridList = tempGridList.(@question_hideByUserID=="null"); > tempGrid.dataProvider = tempGridList; > tempGrid.columns = tempGrid.columns.filter(tempGridColFilter); > tempGrid.id = 'grid'+ secti...@section_sectionid > //There is a bug that prevents only showing one line with this:tempGrid.showHeaders = false; > //use below instead > tempGrid.headerHeight = 0; > tempGrid.width = 348; > tempGrid.columns[0].dataField="@questionDisplay"; > tempGrid.columns[1].dataField="@question_questionID"; > tempGrid.columns[1].visible=false; > tempGrid.columns[2].dataField="@question_sortOrder"; > tempGrid.columns[2].visible=false; > tempGrid.rowCount = tempGridList.length(); > tempGrid.addEventListener(MouseEvent.CLICK,qDgClick,true,1,false); > newPanel.addChild(tempGrid); > } > } > } > } > } > //This is an addon to the above function > private function newTempGridicd9ColFilter(element:*, index:int, arr:Array):Boolean{ > var quickArrayicd9:Array = ["@icd9_color","@icd9_icd9","@templateIcd9_name","@templateIcd9_templateIcd9 ID"] > return (quickArrayicd9.indexOf(element.dataField) != -1); > } > private function tempGridColFilter(element:*, index:int, arr:Array):Boolean{ > var quickArray:Array = ["@questionDisplay","@question_sortOrder","@question_questionID"] > return (quickArray.indexOf(element.dataField) != -1); > } >