{lang: 'de'}
Flashhilfe.de - Flash Community

Itemrenderer im Datagrid umbauen [Flex 4]

 


AntwortenRegistrieren Seite1  

flex5500#1
Benutzerbild von flex5500
Beiträge: 14
Wohnort: Koblenz
Registriert: Jul 2011

18.08.2011, 09:48

Hi Leute,

und zwar geht es hier um einen Datumsrenderer. Ich brauch den Itemrenderer nicht nur zu Darstellungszwecken sondern auch für Interaktionen mit dem Benutzer. In diesem Fall muss sobald das Datum verändert wird ein Serviceaufruf zur Datenbank mit dem neuen Datum. Mit google habe ich hier diesen Codeschnipsel gefunden und etwas angepasst:

PHP:
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
<mx:DateField xmlns:fx="http://ns.adobe.com/mxml/2009" 
              xmlns:s="library://ns.adobe.com/flex/spark" 
              xmlns:mx="library://ns.adobe.com/flex/mx"
              implements="mx.controls.listClasses.IListItemRenderer"
              focusIn="open()" click="datefield1_clickHandler(event)">
   
    <fx:Script>
        <![CDATA[
            override public function set data(value:Object):void{
                if(listData){
                    var newDate:Date;
                   
                    if (value is String){
                        newDate = new Date(Date.parse(data as String));
                        super.data=newDate;
                    }
                    else if (value is Date){
                        super.data=value as Date;
                    }
                }
            }
           
            protected function datefield1_clickHandler(event:MouseEvent):void
            {
                // TODO Auto-generated method stub               
            }       
        ]]>
    </fx:Script>
</mx:DateField> 


wobei es doch etwas ungewöhnlich ist das der erste Tag die zu beinhaltende Kompononente ist. So funktioniert die Darstellung des Datums einwandfrei. Ich habe aber bei dem hier das Problem, dass ich bei einem Funktionsaufruf (datefield1_clickHandler) nicht die ID der Komponente ansprechen kann. Normalerweise wäre es mir lieber wenn der Tag mit

<s:MXDataGridItemRenderer xmlns:fx="http://ns.adobe.co/mxml/2009"
....
....

anfangen würde.

und daher habe ich versucht den Itemrenderer etwas umzubauen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<s:MXDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
                          xmlns:s="library://ns.adobe.com/flex/spark" 
                          xmlns:mx="library://ns.adobe.com/flex/mx"           
                          xmlns:itemRenderer="tabbarContent.datagridUsers.popup.itemRenderer.*"
                          width="100%" height="100%" focusEnabled="true" autoDrawBackground="true">
   
    <fx:Script>
        <![CDATA[
           
            [Bindable]protected var date:String;
           
            override public function set data(value:Object):void 
            {       
                date = value[dataGridListData.dataField];
            }
           
        ]]>
    </fx:Script>
   
    <itemRenderer:DateEditorComponent horizontalAlign="center" left="0" top="0" right="0" bottom="0" />
   
</s:MXDataGridItemRenderer> 


die DateEditorComponent.as, die ich aus einem anderen Beispiel abgeleitet habe sieht wie folgt aus:

PHP:
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
package tabbarContent.datagridUsers.popup.itemRenderer
{
    /**
     * @author cvarzar
     */
   
    import mx.containers.HBox;
    import mx.controls.DateField;
    import mx.controls.listClasses.IListItemRenderer;
   
    public class DateEditorComponent extends HBox
    {   
        private var _value:int;
       
        public function DateEditorComponent()
        {
            super();       
        }
       
        public function get value():int {
            return _value;
        }
       
        override public function set data(value:Object):void{
            //if(listData){
                var newDate:Date;               
               
                if (value is String){
                    newDate = new Date(Date.parse(data as String));
                    super.data=newDate;
                }
                else if (value is Date){
                    super.data=value as Date;
                }
                var datum:DateField = new DateField();
                datum.data = newDate;           
                addElement(datum);
            //}
        }
       
       
    }   


Die Werte die hier verarbeitet sind kann man erst mal ein wenig außer acht lassen. Erwähnenswert ist nur das die Werte aus der Datenbank mit Hilfe eines ValueObjects kommen und für die  betreffende Spalte ein Wert wie 01.02.2011 zurückliefern, welcher mit dem funktionierendem mx: DateField korrekt dargestellt wird.

Wenn ich das Beispiel so umbaue will mir das Datagrid weder etwas anzeigen noch etwas darstellen...

weiß da jemand Rat?

Viele Grüße
Christian
Geändert von flex5500 am 18.08.11 um 09:52 Uhr
Sebastian#2
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6981
Wohnort: München
Registriert: Jan 2002

30.08.2011, 14:27