datagrid éditable créée dynamiquement
Bonjour,
Je cherche à créer dynamiquement des DataDrid en fonction d'une source de données (pour l'instant XML), et j'ai une erreur à l'utilisation (voir à la fin de ce post).
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
contentCreationComplete="init()">
<fx:Declarations>
<fx:XML id="xmlData" source="xml/xmlData.xml"/>
<s:ArrayList id="columns">
<s:GridColumn dataField="@nom" editable="true"/>
</s:ArrayList>
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.collections.XMLListCollection;
import spark.components.DataGrid;
private function init():void {
var elt:XMLList = xmlData.element.(@nom == "Test1");
// Pour tous les regroupements
for each(var grp:XML in elt.regroupements.regroupement) {
// Ajoute d'une dataGrid au panel (contenant les items du groupe)
var dataGrid:DataGrid = new DataGrid();
dataGrid.dataProvider=new XMLListCollection(grp.item);
dataGrid.columns=columns;
dataGrid.editable=true;
panel.addElement(dataGrid);
}
}
]]>
</fx:Script>
<s:Panel id="panel">
<s:layout>
<s:TileLayout requestedColumnCount="3"/>
</s:layout>
</s:Panel>
</s:Application> |
Voici le fichier XML:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| <provider>
<element nom="Test1">
<regroupements>
<regroupement nom="grp1">
<item nom="Grp1Item1"/>
<item nom="Grp1Item2"/>
<item nom="Grp1Item3"/>
</regroupement>
<regroupement nom="grp2">
<item nom="Grp2Item1"/>
<item nom="Grp2Item2"/>
<item nom="Grp2Item3"/>
<item nom="Grp2Item4"/>
<item nom="Grp2Item5"/>
</regroupement>
<regroupement nom="grp3">
<item nom="Grp3Item1"/>
<item nom="Grp3Item2"/>
<item nom="Grp3Item3"/>
</regroupement>
<regroupement nom="grp4">
<item nom="Grp4Item1"/>
<item nom="Grp4Item2"/>
</regroupement>
</regroupements>
</element>
<element nom="Test2">
<regroupements>
<regroupement nom="grp1">
<item nom="Grp1Item1"/>
<item nom="Grp1Item2"/>
</regroupement>
<regroupement nom="grp2">
<item nom="Grp2Item1"/>
<item nom="Grp2Item2"/>
<item nom="Grp2Item3"/>
<item nom="Grp2Item4"/>
</regroupement>
<regroupement nom="grp3">
<item nom="Grp3Item1"/>
<item nom="Grp3Item2"/>
</regroupement>
<regroupement nom="grp4">
<item nom="Grp4Item1"/>
<item nom="Grp4Item2"/>
<item nom="Grp4Item3"/>
<item nom="Grp4Item4"/>
<item nom="Grp4Item5"/>
</regroupement>
</regroupements>
</element>
</provider> |
Ici, à partir d'un fichier XML, je crée dynamiquement plusieurs dataGrid. Dans ce cas, 4 dataGrid.
Par contre, lorsque j'essaie d'éditer les deux premières lignes de n'importe quelle dataGrid, ça fonctionne, dès que j'essaie de modifier une ligne d'indice supérieure, J'ai une erreur:
Citation:
TypeError: Error #1009: Il est impossible d'accéder à la propriété ou à la méthode d'une référence d'objet nul.
at spark.components.gridClasses::DefaultGridItemEditor/prepare()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\components\gridClasses\DefaultGridItemEditor.mxml:114]
at spark.components.gridClasses::DataGridEditor/http://www.adobe.com/2006/flex/mx/internal::createItemEditor()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\components\gridClasses\DataGridEditor.as:623]
at spark.components.gridClasses::DataGridEditor/setEditedItemPosition()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\components\gridClasses\DataGridEditor.as:286]
at spark.components.gridClasses::DataGridEditor/dataGrid_gridItemEditorSessionStartingHandler()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\components\gridClasses\DataGridEditor.as:1204]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\core\UIComponent.as:13128]
at spark.components.gridClasses::DataGridEditor/startItemEditorSession()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\components\gridClasses\DataGridEditor.as:798]
at spark.components::DataGrid/startItemEditorSession()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\components\DataGrid.as:3803]
at spark.components.gridClasses::DataGridEditor/grid_gridMouseUpHandler()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\components\gridClasses\DataGridEditor.as:1379]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\core\UIComponent.as:13128]
at spark.components::Grid/dispatchGridEvent()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\components\Grid.as:4038]
at spark.components::Grid/grid_mouseDownDragUpHandler()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\components\Grid.as:3883]
at Function/<anonymous>()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\utils\MouseEventUtil.as:96]
Tout ce comporte comme-ci une fois chargé, le data provider était celui de la dernière liste.
Donc, pour que cela fonctionne, il faut que le dernier dataGrid soit celui qui a le plus grand nombre de lignes. Ce qui n'est pas acceptable.
Je ne comprends pas, normalement chaque instance de datagrid doit avoir son propre dataprovider.
Avez-vous ne serait-ce qu'une piste?