![]() |
|
||||||||||
|
|||||
|
Регистрация: Aug 2009
Сообщений: 6
|
Как можно реализовать редактирование поля в DataGrid с помощью ComboBox? Причем данные для этого поля должны браться из другой таблицы.
Вот код msxml:
Последний раз редактировалось Skabeika; 03.08.2009 в 19:40. |
|
|||||
|
Регистрация: Aug 2009
Сообщений: 6
|
editBooksAdminCellEnd работает с текстовыми полями нормально (я его не сам придумал а списал с какого-то примера, не помню уже какого)
private function editBooksAdminCellEnd(e:DataGridEvent):void { var rowIndex:int = e.rowIndex; var columnIndex:Number = e.columnIndex; var vo:* = bookAdminArray[rowIndex]; var col:DataGridColumn = booksAdmin.columns[columnIndex]; var newvalue:String = booksAdmin.itemEditorInstance[col.editorDataField]; if (newvalue == "") { booksAdmin.itemEditorInstance[col.editorDataField] = vo.name; return; } if (newvalue == vo.name) { return; } CursorManager.setBusyCursor(); var parameters:* = { "method": "Update", "id": vo.id, "new": newvalue } gateway = new HTTPService(); gateway.url = BOOK_URL; gateway.method = "POST"; gateway.useProxy = false; gateway.request = parameters; gateway.addEventListener(ResultEvent.RESULT, resultUpdateBooksHandler); gateway.addEventListener(FaultEvent.FAULT, faultUpdateBooksHandler); gateway.send(); } Почти все похожие примеры в google используют собственные компоненты, не существует ли метода попроще? И можно ли такое сделать с помощью компонентов? Последний раз редактировалось Skabeika; 03.08.2009 в 19:55. Причина: Добавление |
|
|||||
|
Modus ponens
|
Пример почти гарантировано отсюда
3-й или второй...http://livedocs.adobe.com/flex/3/htm...leditor_8.html Только разница в том, что у вас редактирование происходит асинхронно - показывайте, что в resultUpdateBooksHandler() находится. parameters - должны быть типа Object, а не *. vo технически может быть типа *, но лучше не допускать такию ситуацию.
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 03.08.2009 в 19:59. |
|
|||||
|
Регистрация: Aug 2009
Сообщений: 6
|
Цитата:
![]() |
|
|||||
|
Регистрация: Aug 2009
Сообщений: 6
|
А все остальное правильно? Просто я ни разу с Flex не работал еще. Что-то мне подсказывает что нужно обработать событие change в ComboBox и как-то установить свойство selected (и то и другое у ComboBox). Но я с ними сколько не игрался так и не добился успеха
Добавлено через 10 минут Не подскажите как можно обновить данные? |
|
|||||
|
Modus ponens
|
Мммм... itemEditor сам уже подписан на "change", так что вы неявно на него подписались. Просто вы никогда itemEditorInstance не кастуете к ComboBox, поэтому вам это может быть не заметно.
т.е. если ваша функция editBooksAdminCellEnd вообще вызывается, то вы подписались на "change" и эта часть сработала нормально. Другое дело, что создавать каждый раз по экземпляру HTTPService - это как-то многовато, лучше было бы создать один экземпляр и использовать его с любым итем-эдитором. Ну, и как бы вы самое главное не сделали - когда приходит результат от сервиса - вам надо эти изменения отразить в дата-провайдере, а вы этого никогда не делаете. <?xml version="1.0" encoding="utf-8"?> <!-- view.ValueTable --> <mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" title="Skill XML" horizontalAlign="center" width="400" height="300" > <mx:Metadata> [Event(name="valueUpdate", type="flash.events.Event")] </mx:Metadata> <mx:Script> <![CDATA[ import flash.events.Event; import mx.controls.listClasses.IDropInListItemRenderer; import mx.controls.TextInput; import mx.events.DataGridEvent; import mx.events.DataGridEventReason; import mx.managers.PopUpManager; private function counter(input:Object, input2:Object):String { var i:int; var ri:int; super.data.(contains(input) ? (ri = i) : i++); return (ri + 1).toString(); } private function editValueBegin(event:DataGridEvent):void { event.preventDefault(); dg.createItemEditor(event.columnIndex, event.rowIndex); (dg.itemEditorInstance as IDropInListItemRenderer).listData = (dg.editedItemRenderer as IDropInListItemRenderer).listData; dg.itemEditorInstance.data = dg.editedItemRenderer.data; (dg.itemEditorInstance as TextInput).setFocus(); } private function editValueEnd(event:DataGridEvent):void { if (event.reason == DataGridEventReason.CANCELLED) return; var newData:String = (dg.itemEditorInstance as TextInput).text; dg.editedItemRenderer.data = dg.itemEditorInstance.data; if (newData == "") { event.preventDefault(); (dg.itemEditorInstance as TextInput).errorString = "This field is mandatory!"; return; } else { (dg.itemEditorInstance as TextInput).text = newData; dispatchEvent(new Event("valueUpdate")); } } ]]> </mx:Script> <mx:DataGrid id="dg" dataProvider="{data}" width="100%" height="100%" editable="true" itemEditBegin="editValueBegin(event)" itemEditEnd="editValueEnd(event)" > <mx:columns> <mx:DataGridColumn headerText="Level" labelFunction="{counter}" editable="false" width="40" resizable="false" /> <mx:DataGridColumn headerText="Value" editable="true" dataField="@val" > <mx:itemEditor> <mx:Component> <mx:TextInput restrict="0-9"/> </mx:Component> </mx:itemEditor> </mx:DataGridColumn> </mx:columns> </mx:DataGrid> <mx:Button label="Close" click="PopUpManager.removePopUp(this)"/> </mx:Panel> А вам прийдется записать, какая позиция редактировалась, когда отправился запрос, и когда ответ на запрос будет получен, заменить эту позицию новыми данными.
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 03.08.2009 в 20:35. |
|
|||||
|
Регистрация: Aug 2009
Сообщений: 6
|
Если создать один экземпляр, то скорее всего придется обнулять handler-ы каждый раз (кода ненамного меньше). У меня вылезало какое-то переполнение буфера из-за этого.
Дело в том, что у меня даже не отображается то что надо, без редактирования. Вроде бы задал свойства dataField, editorDataField. Тогда почему не отображается соответствующая запись из списка, а значение первичного ключа. Почем не работает двунаправленное связывание??? |
|
|||||
|
Modus ponens
|
Двунаправленое связывание - фича новая, и не везде работает, как раз например в аргументах сервиса - не работает.
Нет, как раз не прийдется обнулять хендлеры. Их вполне можно использовать многократно. вы видите первичное значение потому, что вы никогда не применяете изменения, вы получаете ответ от сервиса - но в коде никак на это не реагируете, т.е. просто ничего не меняете - вам нужно в resultUpdateBooksHandler записать новое значение туда, где вы его до запроса хотели поменять.
__________________
Hell is the possibility of sanity |
![]() |
![]() |
Часовой пояс GMT +4, время: 16:22. |
|
|
« Предыдущая тема | Следующая тема » |
|
|