Установка DataFrid DataGridColumn на основе узла XML с тем же именем - PullRequest
0 голосов
/ 25 мая 2010

Я застрял.

Учитывая этот XML:

<matrix>
<row>
    <column>0.51</column>
    <column>0.52</column>
    <column>0.53</column>
    <column>0.54</column>
</row>
<row>
    <column>0.61</column>
    <column>0.62</column>
    <column>0.63</column>
    <column>0.64</column>
</row>

Я пытаюсь определить DataGrid таким образом, чтобы узлы строк представляли новые строки в DataGrid, а узлы столбцов использовались для автоматического заполнения столбцов DataGrid. У меня проблема с настройкой dataField для каждого из созданных объектов DataGridColumn. DataGrid создан, но все значения ячеек для строки 1 равны 0,51, а для строки 2 - 0,61.

Что я здесь не так делаю?

1 Ответ

1 голос
/ 25 мая 2010

Я думаю, что вас сбивает с толку то, что вы не можете определить DataGrid таким образом (по крайней мере, без большой адаптации). По сути, DataGrid ожидает набор объектов, которые будут отображаться в виде набора строк.

Столбцы начинают играть как представления о конкретных свойствах данных объектов в dataProvider. DataGridColumn отобразит свойство, соответствующее значению его свойства dataField.

Итак, быстрый / грязный пример. У меня возникли проблемы с использованием XML в качестве источника данных по какой-то причине, поэтому я преобразовал ваши данные в общие объекты - а не то, что я бы порекомендовал на практике - чтобы объяснить, как таблица данных заполняет столбцы:

<mx:Script>
<![CDATA[

    private var data:Array = [
                         {column0:0.51, column1:0.52, column2:0.53, column3:0.54},
                         {column0:0.61, column1:0.62, column2:0.63, column3:0.64}
                        ];

    private var dataDisplayDP:ArrayCollection = new ArrayCollection(data);

    private function dataDisplayerCreationListener():void
    {
    dataDisplayer.dataProvider = dataDisplayDP;
    }      

]]>>
</mx:Script>

<mx:DataGrid id="dataDisplayer" creationComplete="dataDisplayerCreationListener()">
  <mx:DataGridColumn dataField="column0"/>
  <mx:DataGridColumn dataField="column1"/>
  <mx:DataGridColumn dataField="column2"/>
  <mx:DataGridColumn dataField="column3"/>
</mx:DataGrid>

Итак, снова идея заключается в том, что каждая строка представляет элемент в вашем dataProvider, в то время как каждый столбец представляет определенное свойство объекта, представленного строкой. Поначалу этот подход может показаться странным, но он позволяет визуально представлять данные в табличном формате без необходимости структурировать данные в табличном формате.

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

Опять же, вы не обязаны использовать только Array или ArrayCollection в качестве источника данных. Из Flex документации по dataProvider:

... [свойство dataProvider] позволяет использовать большинство типов объектов в качестве поставщиков данных. Если вы установите свойство dataProvider в Array, оно будет преобразовано в ArrayCollection. Если вы установите свойство для объекта XML, оно будет преобразовано в коллекцию XMLListCollection только с одним элементом. Если вы установите для свойства значение XMLList, оно будет преобразовано в коллекцию XMLListCollection. Если вы установите свойство для объекта, который реализует интерфейс IList или ICollectionView, объект будет использоваться напрямую.

Кстати, я довольно уверен, что вы не получите преимущества автоматического обновления представлений, если вы используете объект Array или XML, даже если они будут преобразованы в объект Collection.

...