First, to make it completely clear, when working with the data, you must always use the underlying dataProvider and item and never the DataGrid or cell itself. This is because itemRenderers are recycled. You can never do any row level work in a renderer in creationComplete for the same reason, but must override the set data() function. Google this.
Also, if I am understanding correctly, there are two other ways to do this. You mentioned labelFunction. That is one way. A label function has access to the entire row item, and can use the values of any property/cell for the display logic. You could also create a value object with a calculated property. Note that if you update the dataProvider programmatically, you should use the dataProvider collection API in order to ensure the correct events are dispatched to update the UI. You can call itemUpdated() if you assign the value of an item.property directly. Tracy Spratt, Lariat Services, development services available _____ From: flexcoders@yahoogroups.com [mailto:flexcod...@yahoogroups.com] On Behalf Of Craig Sent: Sunday, July 12, 2009 11:58 PM To: flexcoders@yahoogroups.com Subject: [flexcoders] Re: This is not as easy as it seems ... apparently... --- In flexcod...@yahoogro <mailto:flexcoders%40yahoogroups.com> ups.com, "postwick" <p...@...> wrote: thank you, sir... I appreciate your help, I shall do as you say !! Craig > > That'll update the value of the cell. > > You can't do what you're trying to do. You can't have a column with a different dataField per row. The dataField for the column is the same for every row. > > Is this data coming from a database, through a view? You really should do this there. You can set up a view column with an if/then that returns the column's value you want. > > --- In flexcod...@yahoogro <mailto:flexcoders%40yahoogroups.com> ups.com, "Craig" <craigj@> wrote: > > > > now we're getting somewhere! but will this update the value of the col2 or the value of col2 DataField? > > > > I am trying to change the value of col2 DataField to "Profit" not the value of col2 itself. > > > > Can I use: > > > > dgOrdExt.getChildAt(i)["Profit"].dataField = "Profit" > > > > CS > > > > > > > > > > --- In flexcod...@yahoogro <mailto:flexcoders%40yahoogroups.com> ups.com, "postwick" <paul@> wrote: > > > > > > You can't use selectedItem because there is no selectedItem. You haven't clicked a row. Try looping through the grid. > > > > > > In the end, I really don't understand why you don't do this in the dataCollection, or even in the source data. > > > > > > for (var i:Number = 0; i < mygrid.numChildren; i++) { > > > if (mygrid.getChildAt(i)["Kind"] == "LONG") { > > > mygrid.getChildAt(i)["Profit"] = "Profit"; > > > } > > > else { mygrid.getChildAt(i)["Profit"] = "ShProfit"; } > > > > > > --- In flexcod...@yahoogro <mailto:flexcoders%40yahoogroups.com> ups.com, "Craig" <craigj@> wrote: > > > > > > > > Ok... In the parent component to the datagrid I used an initialize event: > > > > > > > > public function initDg():void { > > > > > > > > if(dgOrdExt.selectedItem["Kind"]=="LONG")dgOrdExt.Profit.dataField="Profit"; > > > > if(dgOrdExt.selectedItem["Kind"]=="SHORT")dgOrdExt.Profit.dataField="ShProfi t"; > > > > > > > > } > > > > > > > > it does not work. but if I replace the code with dgOrdExt.dataField="Profit"; which just sets the dataField without referencing the other column the code is all working... > > > > > > > > I also tried creationcomplete event and that did not work either. > > > > > > > > > > > > > > > > --- In flexcod...@yahoogro <mailto:flexcoders%40yahoogroups.com> ups.com, "Craig" <craigj@> wrote: > > > > > > > > > > cause I was doing it within the custom component (column) itself for the datagrid, which can not hold an Id value, I can put it in the parent component however.... i'll give that a whack. > > > > > > > > > > > > > > > --- In flexcod...@yahoogro <mailto:flexcoders%40yahoogroups.com> ups.com, "postwick" <paul@> wrote: > > > > > > > > > > > > Not sure why you have all the Application.application stuff on there. Just reference the datagrid by it's id. > > > > > > > > > > > > <mx:DataGrid id="mygrid"....> > > > > > > > > > > > > mygrid.selectedItem["columname"] = "some value" > > > > > > > > > > > > --- In flexcod...@yahoogro <mailto:flexcoders%40yahoogroups.com> ups.com, "Craig" <craigj@> wrote: > > > > > > > > > > > > > > From within the custom component DataGrid Column I tried this code as you suggested at the initialize event but it errors: > > > > > > > > > > > > > > if(Application.application.CnvPos.dgOrdExt.selectedItem["Kind"]=="LONG") Profit.dataField="Profit"; > > > > > > > > > > > > > > > > > > > > > I don't think the selecteditem field is the answer. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --- In flexcod...@yahoogro <mailto:flexcoders%40yahoogroups.com> ups.com, "Craig" <craigj@> wrote: > > > > > > > > > > > > > > > > yes the datagrid is bound to an array collection. > > > > > > > > I don't want to select any item, I want to change the value of a column's DataField to a one of two values based on the value of another column's output. > > > > > > > > > > > > > > > > I don't want to have to 'selecteditem' but I can try that code below are you suggesting that I use it in the labelfunction of the datagrid column that I am trying to change? > > > > > > > > > > > > > > > > > > > > > > > > --- In flexcod...@yahoogro <mailto:flexcoders%40yahoogroups.com> ups.com, "postwick" <paul@> wrote: > > > > > > > > > > > > > > > > > > Is the datagrid bound to a collection? if so, change the value in the collection. > > > > > > > > > > > > > > > > > > or try... > > > > > > > > > > > > > > > > > > yourDataGrid.selectedItem["dataColumn1"] = yourDataGrid.selectedItem["dataColumn2"] > > > > > > > > > > > > > > > > > > --- In flexcod...@yahoogro <mailto:flexcoders%40yahoogroups.com> ups.com, "Craig" <craigj@> wrote: > > > > > > > > > > > > > > > > > > > > I am trying to set the value of a column based on the value of another column. If I use ...selectedItem... it does not work, unless I am mistaken. > > > > > > > > > > > > > > > > > > > > --- In flexcod...@yahoogro <mailto:flexcoders%40yahoogroups.com> ups.com, "postwick" <paul@> wrote: > > > > > > > > > > > > > > > > > > > > > > You access the value in a column of a datagrid like this... > > > > > > > > > > > > > > > > > > > > > > yourDataGrid.selectedItem["dataColumnNameOfColumn"] > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --- In flexcod...@yahoogro <mailto:flexcoders%40yahoogroups.com> ups.com, "Craig" <craigj@> wrote: > > > > > > > > > > > > > > > > > > > > > > > > I GIVE UP!! I have tried everything!!.. I have a dataGrid that binds to > > > > > > > > > > > > an ArrayCollection. I need to change the value of one columen (Profit) > > > > > > > > > > > > based on the value of another column (Kind) ie.. the results (either > > > > > > > > > > > > 'LONG' or SHORT'). Here is where I'm at. I've tried putting code into > > > > > > > > > > > > customer DataGridColumns and labelFunctions and ItemRenderers... but can > > > > > > > > > > > > not do it. What seem to be working most are events in the DataGrid > > > > > > > > > > > > Component, better than others, but comparing values in a DataGrid is > > > > > > > > > > > > obviously impossible. > > > > > > > > > > > > > > > > > > > > > > > > Somehow I need the code to access ArrayCollection getItemat() but I > > > > > > > > > > > > can't do it! > > > > > > > > > > > > > > > > > > > > > > > > Please help! > > > > > > > > > > > > > > > > > > > > > > > > <mx:DataGrid xmlns:mx="http://www.adobe. <http://www.adobe.com/2006/mxml> com/2006/mxml" > > > > > > > > > > > > initialize="initTA()"> > > > > > > > > > > > > > > > > > > > > > > > > <positions:KindColumn id="Kind" > > > > > > > > > > > > headerText="Kind" > > > > > > > > > > > > dataField="Kind" > > > > > > > > > > > > itemRenderer="com.steury.baseClasses.CellFieldTrd"/> > > > > > > > > > > > > <positions:ProfitColumn id="Profit" > > > > > > > > > > > > headerText="Profit"/> > > > > > > > > > > > > > > > > > > > > > > > > <mx:Script> > > > > > > > > > > > > <![CDATA[ > > > > > > > > > > > > import mx.collections.ArrayCollection; > > > > > > > > > > > > import com.steury.baseClasses.*; > > > > > > > > > > > > import mx.core.Application; > > > > > > > > > > > > import mx.controls.dataGridClasses.DataGridListData; > > > > > > > > > > > > import flash.events.Event; > > > > > > > > > > > > import mx.core.ClassFactory; > > > > > > > > > > > > import com.steury.controls.positions.*; > > > > > > > > > > > > import mx.controls.dataGridClasses.DataGridColumn; > > > > > > > > > > > > import mx.controls.DataGrid; > > > > > > > > > > > > > > > > > > > > > > > > private function initTA():String { > > > > > > > > > > > > if (value[Kind.dataField]=="LONG")Profit.dataField="Profit"; > > > > > > > > > > > > if > > > > > > > > > > > > (value[Kind.dataField]=="SHORT")Profit.dataField="ShProfit"; > > > > > > > > > > > > Profit.itemRenderer=new > > > > > > > > > > > > ClassFactory(com.steury.baseClasses.CellFieldInt); > > > > > > > > > > > > return myDec.format(Profit)+"%"; > > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --- In flexcod...@yahoogro <mailto:flexcoders%40yahoogroups.com> ups.com, "Craig" <craigj@> wrote: > > > > > > > > > > > > > > > > > > > > > > > > > > I am trying to access the value of a DataGridColumn and change the > > > > > > > > > > > > > DataField for another column based on this value... > > > > > > > > > > > > > Here is my code: > > > > > > > > > > > > > > > > > > > > > > > > > > <?xml version="1.0" encoding="utf-8"?> > > > > > > > > > > > > > <mx:DataGrid xmlns:mx="http://www.adobe. <http://www.adobe.com/2006/mxml> com/2006/mxml" > > > > > > > > > > > > > creationComplete="getDp()" > > > > > > > > > > > > > > > > > > > > > > > > > > > ... Datagrid> > > > > > > > > > > > > > <mx:columns> > > > > > > > > > > > > > <mx:DataGridColumn dataField="Ticker" > > > > > > > > > > > > > headerText="Ticker"/> > > > > > > > > > > > > > <mx:DataGridColumn id="Kind" > > > > > > > > > > > > > dataField="Kind" > > > > > > > > > > > > > itemRenderer="com.steury.baseClasses.CellFieldTrd" /> > > > > > > > > > > > > > <mx:DataGridColumn id="Profit" > > > > > > > > > > > > > headerText="Profit"/> > > > > > > > > > > > > > > > > > > > > > > > > > > ActionScript: > > > > > > > > > > > > > > > > > > > > > > > > > > private function getDp():void { > > > > > > > > > > > > > > > > > > > > > > > > > if(Application.application.CnvPos.dgOrdExt.selectedItem.Kind=="LONG")Pro\ > > > > > > > > > > > > \ > > > > > > > > > > > > > > > > > > > > > > > > > fit.dataField="Profit";Application.application.CnvPos.dgOrdExt.refresh()\ > > > > > > > > > > > > \ > > > > > > > > > > > > > ; > > > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > //This code works find if I use > > > > > > > > > > > > > > > > > > > > > > > > > > if(Kind.DataField="Kind")Profit.dataField="Profit"; > > > > > > > > > > > > > > > > > > > > > > > > > > //above to test the rest of the code. > > > > > > > > > > > > > > > > > > > > > > > > > > I can not figure out how to access the value of the Datagridcolumn. I > > > > > > > > > > > > > have tied using event listeners, etc.. which did not work. Please let > > > > > > > > > > > > > me know if anyone can help this fairly simple dilemma. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >