Функция ярлыка мешает редактору элементов Combobox - PullRequest
0 голосов
/ 27 июня 2011

Моя проблема заключается в том, что когда пользователь щелкает ячейку таблицы данных, в которой есть редактор комбинированного списка, а затем сразу же щелкает мышью вне ячейки, текстовое значение в этой ячейке исчезает.

У меня есть обработчик itemEditEnd в сетке данных, и он прекрасно показывает значение свойства, которое я использую в качестве editorDataField. Но labelFunction (которая вызывается после обработчика itemEditEnd) в этом столбце сетки видит его как ноль.

Почему labelFunction и редактор элементов не работают вместе?

Вот столбец 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;
        }

А вот код, выполненный в 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;

Однако функция label выполняется после этого, и значение item.attribId равно 0. И именно поэтому fieldName является пустой строкой, потому что совпадения нет.

1 Ответ

0 голосов
/ 28 июня 2011

Мое исправление, указанное в комментариях, похоже, работает.Основная проблема заключается в том, что свойство editorDataField было установлено только тогда, когда пользователь взаимодействовал с полем со списком.

Я исправил эту проблему, установив ее в методе переопределения открытых функций set data ().Таким образом, как только пользователь прикасается к нему, он устанавливается.

...