Labelfunction会干扰Combobox项目编辑器

时间:2011-06-27 15:39:21

标签: flex actionscript-3 flex4

我的问题是,当用户单击具有组合框编辑器的数据网格单元格然后立即单击该单元格时,该单元格中的文本值将消失。

我在datagrid上有一个itemEditEnd处理程序,它显示了我用作editorDataField的属性的值。但是该网格列上的labelFunction(在itemEditEnd处理程序之后调用)将其视为零。

为什么labelFunction和item编辑器不能很好地协同工作?

这是DataGridColumn:

<mx:DataGridColumn  
                                headerText="Field Name" 
                                dataField="attribId"
                                editorDataField="attributeId"
                                labelFunction="getFieldName">

这是项目编辑器

                            <mx:itemEditor>

                                <mx:Component>

                                    <mx:ComboBox 
                                        dataProvider="{this.outerDocument.lendersModel.fileAttributes}"
                                        creationComplete="{outerDocument.selectAttribute();}"
                                        labelField="fileAttribDesc"
                                        change="updateAttribute(event);"
                                        selectedIndex="-1">


                                        <mx:Script>
                                            <![CDATA[                                                   
                                                [Bindable]
                                                public var attributeId:int;
                                                private var fileDetailRecordType:String;

                                                override public function set data( value:Object ):void{
                                                    this.attributeId = value.attribId; // adding this line appears to be the fix. 
                                                    var category:String = value.category;

                                                    this.filterFileAttributes( category );
                                                }

                                                /** Change handler for combobox in Record Type column.  
                                                 */
                                                private function filterFileAttributes( recordType:String ):void{
                                                    this.fileDetailRecordType = recordType;

                                                    this.dataProvider.filterFunction = filterByRecordType;
                                                    this.dataProvider.refresh();
                                                }

                                                /** Filters the file attributes collection based on the record type. 
                                                 */
                                                private function filterByRecordType( item:Object ):String{
                                                    return item.category.match( this.fileDetailRecordType );
                                                }

                                                private function updateAttribute( event:* ):void{ 
                                                    attributeId = event.currentTarget.selectedItem.attribId;
                                                    this.outerDocument.selectedAttributeId = attributeId;
                                                }

                                            ]]>
                                        </mx:Script>

                                    </mx:ComboBox> 

                                </mx:Component>

                            </mx:itemEditor>

,这是DataGridColumn的标签函数。

        private function getFieldName( item:Object, dgc:DataGridColumn ):String{
            var fieldName:String = '';

            /* At this point the lendersModel.fileAttributes collection is
               filtered based on the record type. We need to remove the filter
               so we can search the entire collection, not just the filtered subset. */
            lendersModel.fileAttributes.filterFunction = refreshFilter;
            lendersModel.fileAttributes.refresh();

            for each( var attrib:FileAttributeDTO in lendersModel.fileAttributes ){
                if( attrib.attribId == item.attribId )
                    fieldName = attrib.fileAttribDesc;
            }

            return fieldName;
        }

以下是在DataErid的itemEditEndHandler中执行的代码:

var rowCount:int = fieldsGridEmpty.selectedIndex;                     var attribCombo:ComboBox = ComboBox(fieldsGridEmpty.itemEditorInstance);

                if( rowCount != -1 && attribCombo.selectedItem != null )
                {                                                           
                    newFieldsDp[ rowCount ].fileAttribute.dataType = attribCombo.selectedItem.dataType;                                         
                    newFieldsDp[ rowCount ].fileAttribute.dataLength = attribCombo.selectedItem.dataLength; 
                    newFieldsDp[ rowCount ].fileAttribute.fileAttribDesc = attribCombo.selectedLabel;   
                    newFieldsDp[ rowCount ].dataLength = attribCombo.selectedItem.dataLength;       
                    newFieldsDp[ rowCount ].attribId = attribCombo.selectedItem.attribId;   
                }  

现在,项目编辑处理程序显示'attribId'的有效值:

newFieldsDp[ rowCount ].attribId = attribCombo.selectedItem.attribId;

然而,标签函数在此之后执行,并且item.attribId的值为0.这就是'fieldName'是空字符串的原因,因为没有匹配。

1 个答案:

答案 0 :(得分:0)

评论中提到的我的解决方案似乎有效。根本问题是editorDataField属性仅在用户与组合框进行交互时设置。

我通过在override public function set data()方法中设置它来解决这个问题。以这种方式,一旦用户触摸它,就设置它。