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 flexcoders@yahoogroups.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.com/>
> Blog: http://blogs.adobe.com/aharui
> 
> From: flexcoders@yahoogroups.com [mailto:flexcod...@yahoogroups.com] On 
> Behalf Of invertedspear
> Sent: Friday, December 11, 2009 2:51 PM
> To: flexcoders@yahoogroups.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,false);
> 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_templateIcd9ID"]
> 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);
> }
>


Reply via email to