Проблема AdvancedDataGrid (ошибка?) - Значки раскрытия в неправильном столбце.(Иерархические данные, Flex 3.5) - PullRequest
0 голосов
/ 10 сентября 2010

Я столкнулся с чем-то смешным и подумал, что стоит опубликовать:

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

Кто-нибудь сталкивался с этим раньше?

Единственное, что я мог придумать, было немного хакерским и, кажется, вводило какое-то странное поведение с иконками раскрытия расширенной сетки. Я включил тестовый пример ниже:

advancedDataGridProblem.as:

 import mx.collections.ArrayCollection;

 public var dataProvider:ArrayCollection = new ArrayCollection([{label:"item1"},
             {label:"item2", children:[{label:"subItem1"},{label:"subItem2"},
             {label:"subItem3"}]},
             {label:"item3"}]);

 public function init():void{
      //using callLater to ensure that the grid has been created before setting DP
      this.callLater(setDataProvider,[dataProvider]);
 }

 public function setDataProvider(list:ArrayCollection):void{
      heirData.source = list;
 }

и mxml:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">
     <mx:Script source="advancedDataGridProblem.as"/>


  <mx:AdvancedDataGrid id="advDG" width="100%">

   <mx:columns>
        <mx:AdvancedDataGridColumn headerText="What the heck?"/>
        <mx:AdvancedDataGridColumn headerText="Label" dataField="label"/>
        <mx:AdvancedDataGridColumn headerText="Column 2"/>
        <mx:AdvancedDataGridColumn headerText="Column 3"/>
   </mx:columns>

   <mx:dataProvider>
        <mx:HierarchicalData id="heirData"/>
   </mx:dataProvider>
 </mx:AdvancedDataGrid>

</mx:Application>

Как вы можете видеть при запуске тестового приложения, значки, которые должны отображаться в столбце «Метка», фактически помещаются в поле «Что за черт?» колонка. Если вы перетащите столбец Label и попытаетесь поменять его местами на «Что, черт возьми?» В столбце значки остаются там, где они есть, но чудесным образом метки, которые ранее были выровнены по левому краю для столбца Метка, теперь отформатированы соответствующим образом для иконок. Перетаскивая столбец Label из слота 1, вы вернете сетку в исходное состояние.

Это немного над моей головой - у кого-нибудь есть предложения?

В идеале, я бы хотел обойти этот хак все вместе и просто назначить dataProvider как обычно во время выполнения.

Заранее спасибо!

В скором времени я опубликую отчет об ошибке с Adobe по этому поводу и добавлю ссылку в комментарий.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2010

Чтобы решить проблему со значком раскрытия, указанную выше, вы можете указать свойство "treeColumn" для AdvancedDataGrid, передав идентификатор столбца, в котором должны быть данные вашего дерева.at liveocs.

Приветствия!

0 голосов
/ 13 сентября 2010

Ну ..

После выходных, чтобы сегодня хорошенько встряхнуть голову и пару свежих глаз, я нашел решение для «легкой» части моего вопроса.

Установить напрямую dataProvider в AdvancedDataGrid намного проще, чем я думал; вам просто нужно привести ArrayCollection в качестве HierarchicalData. Честно говоря, я пробовал это раньше, но неправильно произносил Hierarchical .. facepalm .

Так или иначе, advancedDataGridProblem.as должен быть изменен на:

import mx.collections.ArrayCollection;
import mx.collections.HierarchicalData;

public var dataProvider:ArrayCollection = new ArrayCollection([{label:"item1"},
                                                                {label:"item2", children:[{label:"subItem1"},{label:"subItem2"},
                                                                {label:"subItem3"}]},
                                                                {label:"item3"}]);

public function init():void{
    //using callLater to ensure that the grid has been created before setting DP
    this.callLater(setDataProvider,[dataProvider]);
}

public function setDataProvider(list:ArrayCollection):void{
    advDG.dataProvider = new HierarchicalData(list);
}

Объявление dataProvider в mxml также можно удалить:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">
 <mx:Script source="advancedDataGridProblem.as"/>


<mx:AdvancedDataGrid id="advDG" width="100%">

 <mx:columns>
    <mx:AdvancedDataGridColumn headerText="What the heck?"/>
    <mx:AdvancedDataGridColumn headerText="Label" dataField="label"/>
    <mx:AdvancedDataGridColumn headerText="Column 2"/>
    <mx:AdvancedDataGridColumn headerText="Column 3"/>
 </mx:columns>
 </mx:AdvancedDataGrid>

</mx:Application>

Запустив этот код, вы по-прежнему можете видеть значки раскрытия в неправильном столбце, но по крайней мере «хакерское» решение по установке dataProvider сетки в mxml. Это также позволяет правильно проверить и отобразить сетку. Установка сетки dataProvider позволяет правильно проверить отображение, где, очевидно, установка его источника иерархических данных dataProvider не вызывает те же методы проверки, требуя от пользователя изменить размер сетки или программист каким-либо образом вызвать проверку (чего я на всю жизнь не мог делает).

Я буду держать вас в курсе вопроса о значке раскрытия. В то же время, я ожидаю, что блокировка первого столбца и использование его исключительно для этих значков будет хорошо работать в моем приложении. Я даже могу превратить этот «недостаток» в «особенность»: P

Ура!

[EDIT]

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

advancedDataGridProblem.as:

import mx.collections.ArrayCollection;
import mx.collections.HierarchicalData;

public var dataProvider:ArrayCollection = new ArrayCollection([{label:"item1"},
                                                                {label:"item2", children:[{label:"subItem1"},{label:"subItem2"},
                                                                {label:"subItem3"}]},
                                                                {label:"item3"}]);

mxml:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
 <mx:Script source="advancedDataGridProblem.as"/>


<mx:AdvancedDataGrid id="advDG" width="100%">

 <mx:columns>
    <mx:AdvancedDataGridColumn headerText="What the heck?"/>
    <mx:AdvancedDataGridColumn headerText="Label" dataField="label"/>
    <mx:AdvancedDataGridColumn headerText="Column 2"/>
    <mx:AdvancedDataGridColumn headerText="Column 3"/>
 </mx:columns>

 <mx:dataProvider>
     <mx:HierarchicalData source="{dataProvider}"/>
 </mx:dataProvider>

 </mx:AdvancedDataGrid>

</mx:Application>

Этот подход обходит возможные проблемы, связанные с необходимостью вручную аннулировать и проверять список сетки, список отображения и т. Д. После установки dataProvider сетки в ActionScript. Мое небольшое замечание, касающееся использования этого метода, заключается в том, что, поскольку это создает одностороннюю привязку в flex 3, я не уверен, смогу ли я использовать методы объекта HierarchicalData для изменения связанной ArrayCollection. Тем не менее, я не искал в источнике HierarchicalData или AdvancedDataGrid, но я не сомневаюсь, что они действительно изменяют источник напрямую. Я опубликую результаты по мере их поступления.

Ура!

...