This is so weird.  I had to copy off my directory, so I could revert
my code and create a build.  After "putting back" my code I was
playing with, the error is no longer there.  It all seemed to work.  I
really wish I knew what changed, since it will probably bite me again
later.  I really appreciate the help.

John
--- In [email protected], "Alex Harui" <[EMAIL PROTECTED]> wrote:
>
> Is it any cell that barfs or the TextInEmbedded cell that barfs?
> rendererIsEditor is false so itemEditorInstance will be null.  Might be
> better if it isn't
> 
>  
> 
>  
> 
>  
> 
>  
> 
>  
> 
> ________________________________
> 
> From: [email protected] [mailto:[EMAIL PROTECTED] On
> Behalf Of j_lentzz
> Sent: Wednesday, September 19, 2007 1:50 PM
> To: [email protected]
> Subject: [flexcoders] Re: DataGrid editor/renderer MouseDownHandler
> error
> 
>  
> 
> Here's the sample of code for the DG, DGColumns and Renderer. I'm
> dynamically adding columns to a DG, so I don't have mxml to show. The
> addColumn method is used to dynamically add. I don't have a code test
> case to provide, since it would be too large. Here is how I call the
> addColumn routine:
> 
> LPA_businessRiskName.addColumn("Business Risk Name",
> "businessRiskName", 200, true, new ClassFactory(TextInEmbedded), obj,
> svco);
> 
> Any help would be greatly appreciated. Thanks a bunch.
> 
> John
> 
> Code snippets follow:
> 
> /* method used to dynamically add columns to data grid */
> 
> public function addColumn(header:String, fieldName:String,
> width:int, visible:Boolean, itemRenderer:IFactory=null,
> defaultValue:Object=null, vco:ValidatorConfigObject=null):void {
> 
> var newColumn:DataGridColumnValidated = new DataGridColumnValidated();
> if (vco != null)
> newColumn.validatorConfigType = vco;
> 
> newColumn.visible = visible;
> // get current columns
> var gridColumns:Array = dg.columns;
> newColumn.headerText = header;
> newColumn.dataField = fieldName;
> if (vco != null) {
> newColumn.deepDataField = fieldName + ".value"; 
> newColumn.dataField = fieldName + ".value";
> }
> else
> newColumn.deepDataField = null;
> newColumn.width = width;
> newColumn.editable=true;
> if (itemRenderer != null) {
> 
> var rendererItem:Object = itemRenderer.newInstance();
> 
> if (rendererItem is TextInEmbedded) {
> var textIn:ClassFactory = new ClassFactory(TextInEmbedded);
> if (vco != null) // assign properties
> textIn.properties = {maxLength:
> StringValidatorConfigObject(vco).maxLength, minLength:
> StringValidatorConfigObject(vco).minLength, required: vco.required,
> vEnabled: vco.enabled};
> // test to see if can edit and then display as label with ... to
> truncate - seems to work
> // this uses a different widget as the editor, but renderers it as a
> label, to allow for truncation
> var labelIn:ClassFactory = new ClassFactory(Lbl);
> labelIn.properties = {truncateToFit: true, maxLength:
> StringValidatorConfigObject(vco).maxLength, minLength:
> StringValidatorConfigObject(vco).minLength, required: vco.required,
> vEnabled: vco.enabled}; 
> //TEST FOR VALIDATIO newColumn.itemRenderer = labelIn;
> //newColumn.itemRenderer = new ClassFactory(ValidatedCellRenderer);
> newColumn.itemEditor = textIn;
> newColumn.itemRenderer = textIn; 
> newColumn.rendererIsEditor = false; // TEST FOR VALIDATION
> }else if (rendererItem is NumericInEmbedded) {
> var numIn:ClassFactory = new ClassFactory(NumericInEmbedded);
> if (vco != null) // assign properties
> numIn.properties = {maxValue:
> NumberValidatorConfigObject(vco).maxValue, minValue:
> NumberValidatorConfigObject(vco).minValue, required: vco.required,
> vEnabled: vco.enabled};
> // test to see if can edit and then display as label with ... to
> truncate - seems to work
> // this uses a different widget as the editor, but renderers it as a
> label, to allow for truncation
> var nlabelIn:ClassFactory = new ClassFactory(Lbl);
> nlabelIn.properties = {truncateToFit: true}; 
> newColumn.itemRenderer = numIn;
> // TEST FOR VALIDATION newColumn.itemRenderer = nlabelIn;
> newColumn.itemEditor = numIn;
> newColumn.rendererIsEditor = true;; // TEST FOR VALIDATION
> }
> 
> }
> gridColumns.push(newColumn);
> dg.columns = gridColumns;
> }
> 
> /* extended DataGridColumn */
> 
> public class DataGridColumnValidated extends DataGridColumn
> {
> private var _validatorConfigType:ValidatorConfigObject=null;
> private var _isRequired:Boolean = false;
> private var _hasValidator:Boolean = false;
> 
> public function DataGridColumnValidated(columnName:String=null)
> {
> super(columnName);
> }
> 
> public var deepDataField:String;
> 
> 
> public function get validatorConfigType():ValidatorConfigObject {
> return _validatorConfigType;
> }
> 
> public function set
> validatorConfigType(value:ValidatorConfigObject):void {
> _validatorConfigType = value;
> _isRequired = value.required;
> }
> 
> public function get isRequired():Boolean {
> return _isRequired;
> }
> 
> public function get hasValidator():Boolean {
> return (_validatorConfigType != null)
> }
> 
> }
> 
> /* itemRenderer - base class follows this section */
> 
> public class TextInEmbedded extends TextIn
> {
> 
> //----------------------------------------------------------
> //
> // Constructor
> //
> 
> //----------------------------------------------------------
> 
> /**
> * Constructor.
> */
> public function TextInEmbedded()
> {
> super(); 
> this.setStyle("backgroundAlpha", 0);
> this.setStyle("borderStyle","none");
> }
> 
> override protected function setField(event:Event,
> fieldValue:String):void {
> this.text = fieldValue;
> // for the embedded numeric type, you must use the data Object
> this.data[event.currentTarget.listData.dataField] = fieldValue;
> }
> 
> }
> }
> 
> /* base class for Renderer */
> 
> public class TextIn extends TextInput 
> {
> 
> private var _val:StringValidator;
> private var _maxLength:Number;
> private var _minLength:Number;
> private var _required:Boolean = false;
> private var _requiredFieldError:String;
> private var _tooLongError:String;
> private var _tooShortError:String;
> private var _vEnabled:Boolean = true;
> private var _locked:Boolean = false;
> 
> //----------------------------------------------------------
> //
> // Constructor
> //
> 
> //----------------------------------------------------------
> 
> /**
> * Constructor.
> */
> public function TextIn()
> {
> super(); 
> 
> _val = new StringValidator();
> _val.source = this;
> _val.property = "text";
> _maxLength = _val.maxLength;
> _minLength = _val.minLength;
> // _required = _val.required; // don't use default for
> StringValidator - let app set
> _requiredFieldError =_val.requiredFieldError;
> _tooLongError =_val.tooLongError;
> _tooShortError =_val.tooShortError;
> _val.enabled = false;
> // _val.triggerEvent="change";
> 
> if (!isNaN(_val.maxLength)) 
> this.maxChars = _val.maxLength;
> 
> this.addEventListener(Event.CHANGE, textChanged);
> 
> 
> _val.addEventListener(mx.events.ValidationResultEvent.INVALID,
> validationFailedHandler);
> _val.addEventListener(mx.events.ValidationResultEvent.VALID,
> validationPassedHandler);
> // register with screen level class to notify this when
> validation event is fired
> // 
> mx.core.Application.application.addEventListener(ValidateWidgetEvent.VAL
> IDATE,
> validateThis, false);
> }
> 
> private function validateThis(event:ValidateWidgetEvent):void {
> var failed:Boolean;
> this.validateNow();
> failed = performValidation();
> if (failed)
> dispatchEvent(new
> ValidateWidgetEvent(ValidateWidgetEvent.VALIDATION_FAILED));
> else
> dispatchEvent(new
> ValidateWidgetEvent(ValidateWidgetEvent.VALIDATION_PASSED));
> }
> 
> 
> private function textChanged(event:Event):void {
> var fieldValue:String = assets.Util.removeLeadingSpaces(this.text);
> setField(event, fieldValue);
> this.validateNow();
> performValidation();
> }
> 
> protected function setField(event:Event, fieldValue:String):void {
> this.text = fieldValue;
> }
> 
> public function performValidation(value:String=null):Boolean {
> if (value == null)
> var fieldValue:String = this.text;
> else
> fieldValue = value;
> 
> if (required) {
> if (fieldValue.length < 1) {
> this.errorString = this.requiredFieldError;
> return(false);
> }
> else
> this.errorString = '';
> }else if (!isNaN(_val.maxLength)) {
> if (fieldValue.length > _val.maxLength) {
> this.errorString = this._tooLongError;
> return(false);
> }
> else
> this.errorString = '';
> }else if (!isNaN(_val.minLength)) {
> if (fieldValue.length < _val.minLength) {
> this.errorString = this._tooShortError;
> return(false);
> }
> else
> this.errorString = '';
> }
> 
> return true; // passed
> }
> 
> protected function
> validationFailedHandler(event:ValidationResultEvent):void {
> this.setStyle("borderStyle","solid");
> trace('validation Failed'); 
> trace('Fail value:' + this.text); 
> // dispatchEvent(new
> ValidationResultEvent(mx.events.ValidationResultEvent.INVALID, true,
> false));
> } 
> 
> protected function
> validationPassedHandler(event:ValidationResultEvent):void {
> this.setStyle("borderStyle","none");
> trace('validation Passed'); 
> trace('Pass value:' + this.text); 
> // dispatchEvent(new
> ValidationResultEvent(mx.events.ValidationResultEvent.VALID, true,
> false));
> } 
> 
> 
> 
> override public function set data(value:Object):void
> {
> super.data = value;
> 
> var dgListData:DataGridListData = listData as DataGridListData;
> var dataGrid:DataGrid = dgListData.owner as DataGrid;
> var column:DataGridColumnValidated =
> dataGrid.columns[dgListData.columnIndex];
> if (column.deepDataField != null) {
> var fields:Array = column.deepDataField.split('.');
> var lastField:String = fields.pop();
> var o:Object = value; // was data
> var n:int = fields.length;
> for (var i:int = 0; i < n; i++)
> o = o[fields[i]];
> if ("value" in o)
> listData.label = o[lastField].toString();
> else
> listData.label = o.toString();
> }
> 
> this.text = listData.label;
> this.toolTip = listData.label;
> 
> 
> // var t1:String = value.businessRiskName.value;
> // var b1:Boolean = value.businessRiskName.passedValidation;
> 
> }
> 
> }
> 
> --- In [email protected] <mailto:flexcoders%40yahoogroups.com>
> , "Alex Harui" <aharui@> wrote:
> >
> > Post the relevant code: The DG, the DGColumns, the Renderers. A small
> > test case if you can create one.
> > 
> > 
> > 
> > Do you have floating hit targets or is the mouse hitting something
> that
> > isn't parented by the renderer?
> > 
> > 
> > 
> > ________________________________
> > 
> > From: [email protected] <mailto:flexcoders%40yahoogroups.com>
> [mailto:[email protected] <mailto:flexcoders%40yahoogroups.com>
> ] On
> > Behalf Of j_lentzz
> > Sent: Wednesday, September 19, 2007 12:09 PM
> > To: [email protected] <mailto:flexcoders%40yahoogroups.com> 
> > Subject: [flexcoders] Re: DataGrid editor/renderer MouseDownHandler
> > error
> > 
> > 
> > 
> > That is what I can't figure out. I don't know what I could do to make
> > it null. I'm trying to use the ideas from your sub-object example, so
> > I can pass in an object to the editor/renderer so it can then validate
> > the value and set a pass/fail validation value - Ex: I 'm passing in
> > an object to businessRiskName where value="high" and
> > passValidation=true. So I'm trying to use the sub-objects
> > businessRiskName.value and businessRiskName.passValidation. I've been
> > able to get them to display properly, but when I click on the datagrid
> > I get the error I've described. I'm wondering if I'm not getting the
> > data from the grid/provider correctly, but don't know where to look.
> > 
> > Any guidance would be greatly appreciated.
> > 
> > Thanks,
> > 
> > John
> > --- In [email protected]
> <mailto:flexcoders%40yahoogroups.com>
> <mailto:flexcoders%40yahoogroups.com>
> > , "Alex Harui" <aharui@> wrote:
> > >
> > > How did itemEditorInstance get to be null?
> > > 
> > > 
> > > 
> > > ________________________________
> > > 
> > > From: [email protected]
> <mailto:flexcoders%40yahoogroups.com>
> <mailto:flexcoders%40yahoogroups.com>
> > [mailto:[email protected]
> <mailto:flexcoders%40yahoogroups.com>
> <mailto:flexcoders%40yahoogroups.com>
> > ] On
> > > Behalf Of j_lentzz
> > > Sent: Wednesday, September 19, 2007 11:23 AM
> > > To: [email protected] <mailto:flexcoders%40yahoogroups.com>
> <mailto:flexcoders%40yahoogroups.com> 
> > > Subject: [flexcoders] Re: DataGrid editor/renderer MouseDownHandler
> > > error
> > > 
> > > 
> > > 
> > > For what it is worth, this is the error I get at runtime when I
> click
> > > on the cell:
> > > 
> > > TypeError: Error #1009: Cannot access a property or method of a null
> > > object reference.
> > > at
> > >
> >
> mx.controls::DataGrid/mx.controls:DataGrid::mouseDownHandler()[E:\dev\fl
> > > ex_201_borneo\sdk\frameworks\mx\controls\DataGrid.as:4239]
> > > --- In [email protected]
> <mailto:flexcoders%40yahoogroups.com> 
> > <mailto:flexcoders%40yahoogroups.com>
> > <mailto:flexcoders%40yahoogroups.com>
> > > , "j_lentzz" <jelentz@> wrote:
> > > >
> > > > I've been working on getting a datagrid to validate and I am
> close. 
> > > > However, whenever I click on a cell in the datagrid, I get a
> runtime
> > > > error in the DataGrid.as file, because my itemEditorInstance is
> > null.
> > > > However, I am providing an extended TextInput to the datagrid
> column
> > > > the itemEditor and the itemRenderer. I've tried setting the
> > > > rendererIsEditor to both true and false, but nothing changes. Has
> > > > anyone seen this? Or can tell me what I'm doing wrong? I'm trying
> to
> > > > follow examples, but obviously I'm doing something wrong.
> > > > 
> > > > Thanks,
> > > > John
> > > >
> > >
> >
>


Reply via email to