If I had to guess what you're doing I'd say a DataGrid would serve your
purpose much more efficiently than what your doing.  Also looks like you
don't have proper separation from your data model and your UI which is going
to lead to code like what you have posted.  Your model can carry the dynamic
fees and charges that belong in them.  Right now your UI is tightly coupled
to your data model.  In fact your UI IS your data model.  If you ever wanted
to change the data model or UI you have to rewrite everything.  DataGrid
will add rows as your model adds entries.

Use ItemRenders and ItemEditors to handle editing those values and rendering
the values from your model.  Renderers are good for adding things like '$'
and ensuring the result has 2 decimal places.  Editors will allow you to
edit the value in the DataGrid.

Something like the following will help your issue a lot.

class Fee {
   public var name : String;
   public var amount : Number;
}

class Bill {
   public var fees : ArrayCollection = new ArrayCollection();

   public get totalAmount() : Number {
       var amount : Number = 0.0;
       for each( var fee in fees ) {
          amount += fee.amount;
       }
       return amount;
   }
}

var bill : Bill = new Bill();
bill.fees.add( new Fee( 8.95, 'Monthly Charge' ) );
bill.fees.add( new Fee( 15.95, 'Service Charge' ) );
bill.fees.add( new Fee( 2.95, 'Taxes' ) );

dataGrid.dataProvider = bill.fees;
totals.text = String( bill.totalAmount );

Now Bill represents the abstract concept of a series of charges.  It
contains the data so you don't need to go back into the UI and look through
components trying to piece back together what the bill is.  When you do this
it's easy to utilize the Bill class to perform operations like what you're
trying to do.

Charlie

On Tue, Mar 1, 2011 at 6:04 PM, Laurence MacNeill <[email protected]>wrote:

> I have several Canvases in a VBox, and inside those Canvasses might (or
> might not be) one or more dynamically-created TextInputs, which are
> displaying fee-amounts in them.  When someone clicks on the TextInput and
> changes the fee-amount, I want to go through all the TextInput's in that
> particular canvas and total up the fees displayed in all the TextInputs in
> that Canvas...
>
> Easy enough, right?  Set a 'change' event listener and use
> Canvas(event.currentTarget.parent).numChildren to loop thru all the children
> in that canvas...
>
> Problem I'm having is that I don't know how to tell what type of child I'm
> looking at --  like if it's a Label, for example, I just want to ignore it
> in that loop.  So how do I tell what type of object it is?
>
> Here's an example of my code:
>
> private function feeAmountChanged(event:Event):void {
>      var totalFees:Number = 0;
>      var tempCanvas:Canvas = Canvas(event.currentTarget.parent);
>      for (var i:int=0; i<tempCanvas.numChildren; i++) {
>           //Here's where I don't know what to do -- how do I say something
> like the following:
>           if (tempCanvas.getChildAt(i) is a TextInput) {
>                //Do my summing here, adding it to totalFees
>           }
>      }
>      //place the amount contained in totalFees in the appropriate box down
> below -- unimportant to this discussion right now
> }
>
>
> I know this is a simple, stupid thing.  But I just can't figure it out.
> LOL
>
> Thanks,
> Laurence MacNeill
> Mableton, Georgia, USA
>
>

Reply via email to