PDA

Просмотр полной версии : ItemRenderer в DataGrid


Astraport
17.01.2011, 21:18
DataGrid имеет два столбца. В первом выводятся данные во втором ItemRenderer кастомномного компонента:

<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:s="library://ns.adobe.com/flex/spark"
horizontalAlign="center"
verticalAlign="middle"
horizontalScrollPolicy="off"
verticalScrollPolicy="off"
width="18"
height="18" >

<s:Button skinClass="components.viewButton" x="0" y="0" toolTip="Посмотреть " click={parentDocument.view1(event)}" />

</mx:VBox>

Компонент - это просто иконка глаза, сделана в виде кнопки для пущего эффекта. По клику меняются данные в первом столбце в выбранной строке (например, появляются).

Необходимо чтобы после клика нельзя было кликнуть по глазу опять. Пробовал this.visual = false и this.enabled = false, но кнопка становится только замутненной, при этом только со второго клика (для первой кнопки, потом с остальными нормально).

Кроме того, при прокрутке большого списка, оказывается, что каким-то образом отключаются и другие рендереры ниже.

Кроме того, при использования скина Zen (да и при некоторых других), этот компонент делает фон под ним другого темного цвета.

Кроме того, не получается менять курсор над рендерором на курсор в виде руки.

Кроме того, если меняется ArrayCollection который является датапровайдером, то это никак не влияет на ренедереры и они остаются недоступными. Как их обновить при изменениях массива?

В общем одни проблемы...

zorexundra
18.01.2011, 11:50
1. Присвойте кнопке свойство id. В обработчике ItemRenderer this.view1(event) управляйте свойствами кнопки, например: id.visible = false;
2. Перепишите методы set, get data для ItemRenderer.
5. Не думаю, что это "правильно", но работает: DataGrid.dataProvider = DataGrid.dataProvider;

Lexxx_HU
19.01.2011, 11:38
Необходимо чтобы после клика нельзя было кликнуть по глазу опять. Пробовал this.visual = false и this.enabled = false, но кнопка становится только замутненной, при этом только со второго клика (для первой кнопки, потом с остальными нормально).

Кроме того, при прокрутке большого списка, оказывается, что каким-то образом отключаются и другие рендереры ниже.

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

Кроме того, если меняется ArrayCollection который является датапровайдером, то это никак не влияет на ренедереры и они остаются недоступными. Как их обновить при изменениях массива?
датагрид меняет сове состояние в нескольких случаях, при добавлении элемента в массиве, при удалении, или при прокрутке. если вы изменили какое значение в массиве и хотите чтоб оно обновилось, сделайте у массива .refresh()

alatar
19.01.2011, 12:00
5. Не думаю, что это "правильно", но работает: DataGrid.dataProvider = DataGrid.dataProvider;
если вы изменили какое значение в массиве и хотите чтоб оно обновилось, сделайте у массива .refresh()
2All, никогда так не делайте. В обоих случаях весь массив элементов будет опрошен заново. Для 2-3 записей это не существенно, но когда их n-цать получите конкретные тормоза при каждом обновлении. Элемент либо сам должен посылать событие PropertyChangeEvent, либо вы должны при обновлении свойств явно вызвать метод ArrayCollection#itemUpdated (http://help.adobe.com/ru_RU/AS3LCR/Flex_4.0/mx/collections/ListCollectionView.html#itemUpdated%28%29)

Astraport
19.01.2011, 17:48
Спасибо всем. Пока временно не могу вернуться к проблеме и проверить ваши советы.