Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 03.08.2009, 19:36
Skabeika вне форума Посмотреть профиль Отправить личное сообщение для Skabeika Найти все сообщения от Skabeika
  № 1  
Ответить с цитированием
Skabeika

Регистрация: Aug 2009
Сообщений: 6
По умолчанию Проблема с ComboBox в DataGrid

Как можно реализовать редактирование поля в DataGrid с помощью ComboBox? Причем данные для этого поля должны браться из другой таблицы.

Вот код msxml:

Код AS3:
<mx:DataGrid id = "booksAdmin"
                                     width = "100%"
                                     height = "100%"
                                     editable = "{editableBookCh.selected}"
                                     dataProvider = "{bookAdminArray}"
                                     creationComplete = "booksAdmin.addEventListener(DataGridEvent.ITEM_EDIT_END, editBooksAdminCellEnd)">
 
...
 
<mx:DataGridColumn id = "izdatBooksAdminCol"
                                                   labelFunction="izdat_labelFunc"
                                                   dataField = "izdat"
                                                   editorDataField="id"
                                                   headerText = "Издательство">
                                    <mx:itemEditor>
                                        <mx:Component>
                                            <mx:ComboBox editable="false"
                                                dataProvider="{outerDocument.bookAdminIzdatArray}"
                                                labelField="name"
 
                                                 />
                                        </mx:Component>
                                    </mx:itemEditor>
                                </mx:DataGridColumn>
...
В приведенном выше примере в массиве bookAdminIzdatArray хранятся данные из родительской таблицы, этот массив заполняется динамически с помощью HttpService. Во время редактирования в ComboBox появляются записи родительской таблицы, но я никак не могу сделать так, чтобы в DataGrid отображался не первичный ключ родительской таблицы, а элементы массива bookAdminIzdatArray. Кроме того, после редактирования пропадает даже этот первичный ключ и не отображается ничего.


Последний раз редактировалось Skabeika; 03.08.2009 в 19:40.
Старый 03.08.2009, 19:47
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Ну так покажите, что вы в editBooksAdminCellEnd делаете - это ж как бы самое главное
__________________
Hell is the possibility of sanity

Старый 03.08.2009, 19:49
Skabeika вне форума Посмотреть профиль Отправить личное сообщение для Skabeika Найти все сообщения от Skabeika
  № 3  
Ответить с цитированием
Skabeika

Регистрация: Aug 2009
Сообщений: 6
editBooksAdminCellEnd работает с текстовыми полями нормально (я его не сам придумал а списал с какого-то примера, не помню уже какого)

Код AS3:
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();
}
Кстати сейчас только я подумал что в параметрах сервису нужно передавать еще и колонку, но это поправимо. А вот как быть с ComboBox, понятия не имею

Почти все похожие примеры в google используют собственные компоненты, не существует ли метода попроще? И можно ли такое сделать с помощью компонентов?


Последний раз редактировалось Skabeika; 03.08.2009 в 19:55. Причина: Добавление
Старый 03.08.2009, 19:56
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 4  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Пример почти гарантировано отсюда 3-й или второй...
http://livedocs.adobe.com/flex/3/htm...leditor_8.html
Только разница в том, что у вас редактирование происходит асинхронно - показывайте, что в resultUpdateBooksHandler() находится.
Код AS1/AS2:
var parameters:* = { "method": "Update", "id": vo.id, "new": newvalue };
parameters - должны быть типа Object, а не *.
vo технически может быть типа *, но лучше не допускать такию ситуацию.
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 03.08.2009 в 19:59.
Старый 03.08.2009, 19:58
Skabeika вне форума Посмотреть профиль Отправить личное сообщение для Skabeika Найти все сообщения от Skabeika
  № 5  
Ответить с цитированием
Skabeika

Регистрация: Aug 2009
Сообщений: 6
Цитата:
Сообщение от wvxvw Посмотреть сообщение
Пример почти гарантировано отсюда 3-й или второй...
http://livedocs.adobe.com/flex/3/htm...leditor_8.html
Только разница в том, что у вас редактирование происходит асинхронно - показывайте, что в resultUpdateBooksHandler() находится.
Собственно вот это

Код AS3:
private function resultUpdateBooksHandler(e:ResultEvent):void {
    CursorManager.removeBusyCursor();
}

Старый 03.08.2009, 20:03
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 6  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Ну так а вам в ней как раз и нужно обновить данные... а вы в ней просто ничего не делаете...
__________________
Hell is the possibility of sanity

Старый 03.08.2009, 20:07
Skabeika вне форума Посмотреть профиль Отправить личное сообщение для Skabeika Найти все сообщения от Skabeika
  № 7  
Ответить с цитированием
Skabeika

Регистрация: Aug 2009
Сообщений: 6
А все остальное правильно? Просто я ни разу с Flex не работал еще. Что-то мне подсказывает что нужно обработать событие change в ComboBox и как-то установить свойство selected (и то и другое у ComboBox). Но я с ними сколько не игрался так и не добился успеха

Добавлено через 10 минут
Не подскажите как можно обновить данные?

Старый 03.08.2009, 20:24
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 8  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Мммм... itemEditor сам уже подписан на "change", так что вы неявно на него подписались. Просто вы никогда itemEditorInstance не кастуете к ComboBox, поэтому вам это может быть не заметно.
т.е. если ваша функция editBooksAdminCellEnd вообще вызывается, то вы подписались на "change" и эта часть сработала нормально. Другое дело, что создавать каждый раз по экземпляру HTTPService - это как-то многовато, лучше было бы создать один экземпляр и использовать его с любым итем-эдитором.
Ну, и как бы вы самое главное не сделали - когда приходит результат от сервиса - вам надо эти изменения отразить в дата-провайдере, а вы этого никогда не делаете.

Код AS3:
<?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>
Вот пример где-то был. Только тут нет асинхронного изменения данных, оно у меня происходит в этой строчке:
Код AS3:
dg.editedItemRenderer.data = dg.itemEditorInstance.data;
А вам прийдется записать, какая позиция редактировалась, когда отправился запрос, и когда ответ на запрос будет получен, заменить эту позицию новыми данными.
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 03.08.2009 в 20:35.
Старый 03.08.2009, 20:31
Skabeika вне форума Посмотреть профиль Отправить личное сообщение для Skabeika Найти все сообщения от Skabeika
  № 9  
Ответить с цитированием
Skabeika

Регистрация: Aug 2009
Сообщений: 6
Если создать один экземпляр, то скорее всего придется обнулять handler-ы каждый раз (кода ненамного меньше). У меня вылезало какое-то переполнение буфера из-за этого.

Дело в том, что у меня даже не отображается то что надо, без редактирования. Вроде бы задал свойства dataField, editorDataField. Тогда почему не отображается соответствующая запись из списка, а значение первичного ключа. Почем не работает двунаправленное связывание???

Старый 03.08.2009, 20:41
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 10  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Двунаправленое связывание - фича новая, и не везде работает, как раз например в аргументах сервиса - не работает.

Нет, как раз не прийдется обнулять хендлеры. Их вполне можно использовать многократно.

вы видите первичное значение потому, что вы никогда не применяете изменения, вы получаете ответ от сервиса - но в коде никак на это не реагируете, т.е. просто ничего не меняете - вам нужно в resultUpdateBooksHandler записать новое значение туда, где вы его до запроса хотели поменять.
__________________
Hell is the possibility of sanity

Создать новую тему Ответ Часовой пояс GMT +4, время: 16:22.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 16:22.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.