It looks like you are not actually changing the data. When the slider value
changes you are only dispatching an event and never updating the actual data
stored in the data provider. When the item renderer comes into view again,
the DataGrid is setting the data property again which is still set to 1.

You need to either handle that SliderEvent you are dispatching and update
the actual data or simply update the data in the slider handler inside the
component, like this:

private function slideChanged(event:SliderEvent):void {
 data.volumn = event.value;
}

You also need to store the data:Object passed into set data:

override public function set data(myVal:Object):void
{
 super.data = myVal;
  mySlider.value = myVal.volumn;
  mySlider.name = myVal.name;
}

> {
> trace("Slider Changed: " + mySlider.name + ",
> Value: " + event.value);
> var myEvent:SliderEvent = new SliderEvent
> (SliderEvent.CHANGE,true,event.cancelable, event.thumbIndex,
> event.value,event.triggerEvent, event.clickTarget,event.keyCode);
> dispatchEvent(myEvent);
> }


On Thu, Jun 26, 2008 at 4:00 PM, gbkpicasso <[EMAIL PROTECTED]> wrote:

>   Tracy
> In trying to follow your best practice, and this being my first
> attempt at a Flex Component, I've been having trouble the past few
> days putting this together.
>
> I tried to look at the livedocs example for the commitProperties()
> and apply it to my example but I'm having trouble making that happen.
>
> I added two private vars to my Component code:
> private var _value:Number;
> private var _name:String;
>
> I see that I can override the set value function for "value" property
> of my slider:
> public function set value(val:Number):void
> {
> trace("I'm in set value);
> _value = val;
> invalidateProperties();
> }
>
> But there is no override for the slider's "name" property. So I
> created a setName(n) function, but I'm not sure how to call this from
> my main application.
> public function setName(n:String):void
> {
> trace("I'm in setName);
> _name = n;
> invalidateProperties();
> }
>
> How do I or When is the set value() function called? I didn't have to
> manually call the set data(). It was called for me when I assigned a
> new object with a name and value for the slider.
> I put trace statement in the set value but it never seemed to be
> called from anything.
>
> I added the override commitProperties() function. But since set value
> is never called and I'm sure how to call it from my main application
> since it's a column inside a datagrid.
>
> override protected function commitProperties():void
> {
> trace("In commitProperties);
> super.commitProperties();
> mySlider.value = _value;
> mySlider.name = _name;
>
> }
>
> Am I going in the wrong direction here? I think I'm close but just
> missing a few pieces, of code that is. Ha Ha.
>
> Thanks for you time and help
> Greg
>
> --- In [email protected] <flexcomponents%40yahoogroups.com>,
> "Tracy Spratt" <[EMAIL PROTECTED]>
> wrote:
> >
> > Whoops, sorry, looking at your code, your are headed in the right
> > direction. Maybe debug to see what is resetting the slider value?
> >
> > Also, best practice is to store the data vlue in a local var, and
> call
> > invalidateProperties(). Do the work in commitProperties(). Set
> data
> > gets called very often, but the call to commitProperties is
> optimized by
> > the framework.
> >
> > Tracy
> >
> > -----Original Message-----
> > From: [email protected] <flexcomponents%40yahoogroups.com>
> > [mailto:[email protected]<flexcomponents%40yahoogroups.com>]
> On Behalf Of Tracy Spratt
> > Sent: Tuesday, June 24, 2008 2:35 PM
> > To: [email protected] <flexcomponents%40yahoogroups.com>
> > Subject: RE: [flexcomponents] Slider in a Datagrid resets when
> Datagrid
> > is scrolled.
> >
> > Item renderers are recycled, so all row-level state must be data-
> driven.
> >
> > Your slider must obtain its value from a property on the
> dataProvider
> > item, and set that value in the commitProperties or
> updateDisplayList
> > methods.
> >
> > It must also update that same dataProvider item property value when
> a
> > user interacts with the control.
> >
> > Find an example of a working itemRenderer and modify that to fit
> your
> > needs, rather than attempt to create one from scratch.
> >
> > Tracy
> >
> > -----Original Message-----
> > From: [email protected] <flexcomponents%40yahoogroups.com>
> > [mailto:[email protected]<flexcomponents%40yahoogroups.com>]
> On Behalf Of gbkpicasso
> > Sent: Monday, June 23, 2008 12:19 PM
> > To: [email protected] <flexcomponents%40yahoogroups.com>
> > Subject: [flexcomponents] Slider in a Datagrid resets when Datagrid
> is
> > scrolled.
> >
> > Hello,
> > I have a HSlider custom component that is used as a column in a
> > datagrid. If I change the value of a slider and then scroll the
> > datagrid so that row does not appear, the value of the slider is
> > reset to it's original value. It does not trigger a change event,
> it
> > only visually moves the slider.
> > This does not happen to rows that are still viewable in the
> datagrid.
> > It only happens to rows that are not seen after the datagrid is
> > scrolled.
> > How can I keep the sliders from changing back to their original
> value?
> >
> > Thanks
> > Greg
> >
> > I have included my Application code and the custom component code
> > below.
> >
> > //-------------------------------------
> > // Application code:
> > //-------------------------------------
> > <?xml version="1.0" encoding="utf-8"?>
> > <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml";
> > layout="absolute">
> >
> > <mx:Script>
> > <![CDATA[
> > import mx.collections.ArrayCollection;
> >
> > [Bindable]
> > private var dataLayers:ArrayCollection = new
> > ArrayCollection(
> > [ {name:'Data 1',value:'1'},
> > {name:'Data 2',value:'1'},
> > {name:'Data 3',value:'1'},
> > {name:'Data 4',value:'1'},
> > {name:'Data 5',value:'1'},
> > {name:'Data 6',value:'1'},
> > {name:'Data 7',value:'1'},
> > {name:'Data 8',value:'1'},
> > {name:'Data 9',value:'1'},
> > {name:'Data 10',value:'1'}]);
> >
> > ]]>
> > </mx:Script>
> > <mx:DataGrid dataProvider="{dataLayers}" width="221">
> > <mx:columns>
> > <mx:DataGridColumn
> > headerText="Name" dataField="name" width="95" />
> > <mx:DataGridColumn
> > headerText="Value" dataField="volumn" itemRenderer="MySlider"/>
>
> >
> >
> >
> > </mx:columns>
> > </mx:DataGrid>
> > </mx:Application>
> >
> > //-------------------------------------
> > // Custom Component code in a file called MySlider.mxml:
> > //-------------------------------------
> > <mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"; width="100%"
> > height="100%">
> > <mx:Script>
> > <![CDATA[
> > import mx.events.SliderEvent;
> >
> > private function slideChanged(event:SliderEvent):void
> > {
> > trace("Slider Changed: " + mySlider.name + ",
> > Value: " + event.value);
> > var myEvent:SliderEvent = new SliderEvent
> > (SliderEvent.CHANGE,true,event.cancelable, event.thumbIndex,
> > event.value,event.triggerEvent, event.clickTarget,event.keyCode);
> > dispatchEvent(myEvent);
> > }
> >
> > override public function set data(myVal:Object):void
> > {
> > mySlider.value = myVal.volumn;
> > mySlider.name = myVal.name;
> > }
> > ]]>
> > </mx:Script>
> > <mx:HSlider id="mySlider" width="100" minimum="0"
> > maximum="1.25" liveDragging="true" change="slideChanged(event)" />
> > </mx:VBox>
> >
> >
> >
> > ------------------------------------
> >
> > Yahoo! Groups Links
> >
> >
> >
> >
> >
> >
> > ------------------------------------
> >
> > Yahoo! Groups Links
> >
>
>  
>

Reply via email to