2012-02-20 3 views
0

У меня есть следующий XML, то есть DataProvider (как Hierarchicaldata) из Advanced DataGrid:Flex AdvancedDataGrid ListItems странное поведение

public var reqData:XML = <root> 
    <Requirement ID="REQ-GEN-0.1" title="exigence gen 1" description="blabla 01" testable="true"/> 
    <RequirementSet ID="GUI REQ"> 
    <Requirement ID="REQ-GUI-1.1" title="exigence ihm 1" description="blabla 11" testable="true"/> 
    <Requirement ID="REQ-GUI-1.2" title="exigence ihm 2" description="blabla 12" testable="false"/> 
    </RequirementSet> 
    <RequirementSet ID="PERF REQ"> 
    <Requirement ID="REQ-PERF-2.1" title="exigence perf 1" description="blabla 21" testable="true"/> 
    <Requirement ID="REQ-PERF-2.2" title="exigence perf 2" description="blabla 22" testable="false"/> 
    <Requirement ID="REQ-PERF-2.3" title="exigence perf 3" description="blabla 23" testable="true"/> 
    <Requirement ID="REQ-PERF-2.4" title="exigence perf 4" description="blabla 24" testable="false"/> 
    <Requirement ID="REQ-PERF-2.5" title="exigence perf 5" description="blabla 25" testable="false"/> 
    <Requirement ID="REQ-PERF-2.6" title="exigence perf 6" description="blabla 26" testable="false"/> 
    </RequirementSet> 
    <RequirementSet ID="BUS REQ"> 
    <RequirementSet ID="BUS 1 REQ"> 
     <Requirement ID="REQ-BUS-3.1.1" title="exigence bus 1" description="blabla 311" testable="false"/> 
     <Requirement ID="REQ-BUS-3.1.2" title="exigence bus 2" description="blabla 312" testable="true"/> 
    </RequirementSet> 
    <RequirementSet ID="BUS 2 REQ"> 
     <Requirement ID="REQ-BUS-3.2.1" title="exigence bus3" description="blabla 321" testable="true"/> 
    </RequirementSet> 
    <RequirementSet ID="BUS 3 REQ"/> 
    <RequirementSet ID="BUS 4 REQ"> 
     <Requirement ID="REQ-BUS-3.4.1" title="exigence bus4" description="blabla 341" testable="false"/> 
    </RequirementSet> 
    <RequirementSet ID="BUS 5 REQ"/> 
    <RequirementSet ID="BUS 6 REQ"/> 
    </RequirementSet> 
</root>; 

А вот AdvancedDataGrid часть:

<mx:AdvancedDataGrid id="reqADGtest" displayItemsExpanded="true" 
              width="95%" height="75%" horizontalCenter="0" 
              contentBackgroundAlpha="0.0" chromeColor="0xdbeaff" 
              openDuration="500" dragEnabled="true" dropEnabled="true" 
              dragMoveEnabled="true" editable="true" 
              variableRowHeight="true" horizontalScrollPolicy="auto"> 
       <mx:columns> 
        <mx:AdvancedDataGridColumn dataField="@ID" headerText="ID"/> 
        <mx:AdvancedDataGridColumn dataField="@title" headerText="Titre"/> 
        <mx:AdvancedDataGridColumn dataField="@testable" headerText="Testable"/> 
        <mx:AdvancedDataGridColumn dataField="@description" headerText="Description" 
                  editorUsesEnterKey="true" 
                  wordWrap="true"/> 
       </mx:columns> 
      </mx:AdvancedDataGrid> 

проблема в том, что, когда я смотрю на длину listItems в AdvancedDataGrid, это составляет 19 при создании, а затем 16 абсолютно неверно (22 элемента). Я хочу получить доступ к некоторым элементам, и я не могу, что действительно раздражает. Это ошибка или что-то еще?

Примечание:

Чтобы получить доступ к элементам по RowIndex и ColumnIndex я делаю следующее:

var advancedDataGridListData:AdvancedDataGridListData = 
       IDropInListItemRenderer(listItems[event.rowIndex][event.columnIndex]).listData 
       as AdvancedDataGridListData; 

IHierarchicalCollectionView(dataProvider).getChildren(
       advancedDataGridListData.item) 

EDITED 23/02/2012

Я проверил свое решение с event.item, но, к сожалению, этот элемент всегда был нулевым, и я не понимал, почему. Так что я посмотрел глубже в исходный код AdvancedDataGridBaseEx и я обнаружил, что это часть исходного кода Adobe):

// send event to create the new one 
     var advancedDataGridEvent:AdvancedDataGridEvent = 
      new AdvancedDataGridEvent(AdvancedDataGridEvent.ITEM_EDIT_BEGINNING, false, true); 
     // ITEM_EDIT events are cancelable 
     advancedDataGridEvent.columnIndex = columnIndex; 
     advancedDataGridEvent.dataField = _columns[columnIndex].dataField; 
     advancedDataGridEvent.rowIndex = rowIndex; 
     dispatchEvent(advancedDataGridEvent); 

Вы можете видеть, что event.item никогда не заполнено !!!! Спасибо Adobe ... Я попробую другое решение, тогда я дам вам отзывы.

ПОСЛЕДНИЙ EDIT

Я решил свою проблему с помощью в моей пользовательской DataGrid:

var xmlNode:XML = this.selectedItem as XML; 
+0

Я в замешательстве ... разве вы не смотрите на dataProvider, я считаю, что listItems отслеживает рендереры, которые динамически создаются и перерабатываются, следовательно, изменяя счет (если вы масштабируете приложение, чтобы привлечь вас, вы должны увидеть еще меньшее число в списке. Я считаю). – shaunhusain

+0

Проблема в том, что я должен получить доступ к элементам rowIndex и columnIndex. У меня есть событие ITEM_EDIT_BEGINNING, и я хочу фильтровать элементы, которые можно редактировать.Это событие просто возвращает RowIndex и ColumnIndex, и я подумал, что это способ доступа к элементам: вар advancedDataGridListData:. AdvancedDataGridListData = \t \t \t \t IDropInListItemRenderer (ListItems [event.rowIndex] [event.columnIndex]) ListData \t \t \t \t как AdvancedDataGridListData; – TheFrenchGuy

+0

Эта часть должна работать нормально, вы получаете ссылки на нулевые объекты при использовании этого кода или вы просто беспокоитесь об изменении размера listItems? Для итерации по всей коллекции просто используйте dataProvider или dataProvider.source; dataProvider должен оставаться согласованным в отношении длины, кроме того, если применяется функция filterFunction. listItems будет меняться в зависимости от того, что отображается на экране (и нескольких дополнительных экстраординарных рендерингов, которые сделаны, чтобы в основном дать ему некоторое представление вперед, чтобы строки сразу же были готовы для отображения заранее). – shaunhusain

ответ

0

Как об этом

dataProvider.getChildren (event.item)

основе при чтении здесь: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/controls/AdvancedDataGridBaseEx.html#event:itemEditBeginning

В качестве альтернативы может быть, этот метод поможет (хотя он защищен, так что вы, возможно, придется сделать «обезьяна патч», чтобы изменить модификатор контроля доступа с защитой для общественности:

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/controls/AdvancedDataGridBaseEx.html#absoluteToVisibleIndices()

Я думаю, что на event.rowIndex и event.columnIndex, это дает вам абсолютные значения, но listItems использует его в зависимости от того, что в настоящее время видимо, а не абсолютных позиций. Не прямой ответ, который я знаю, но здесь очень поздно.

+0

См. Мое редактирование (недостаточно места здесь) – TheFrenchGuy

+0

Решенный! Благодаря! Я просто получаю элемент с помощью: var xmlNode: XML = this.selectedItem как XML; – TheFrenchGuy

+0

Без проблем рад, что вы смогли понять это, и мне не пришлось снова пытаться копаться в коде ADG :) – shaunhusain