• beyond tellerrand – play. Register Now!
Zurück   Flashforum > Flex und AIR > Flex programmieren

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 11-08-2008, 18:10   #1 (permalink)
GelegenheitsUser
 
Registriert seit: Jul 2004
Ort: Berlin
Beiträge: 114
Eigener itemRenderer für DataGrid

Hallo,

Ich möchte gerne einen eigenen itemRenderer für ein DataGrid erzeugen (alles in reinem AS3 ohne mxml) um darin ein eigenes Object anstatt Text anzuzeigen, habe aber keine Ahnung wie man das bewerkstelligt. Die Flash Hilfe bringt mich in diesem Punkt leider auch nicht so wirklich weiter... Hier ein simples Beispiel:

PHP-Code:
// Create the DataGrid
dataGrid = new DataGrid();
dataGrid.percentWidth  100;
dataGrid.percentHeight 100;
addChild(dataGrid);

// Create the columns for the DataGrid 
dgCol1 = new DataGridColumn("Spalte 1");
dgCol1.dataField="field1";

dgCol2 = new DataGridColumn("Spalte 2");
dgCol2.dataField="field2";
dgCol2.itemRenderer =  ??? // hier müsste der eigene itemRenderer rein
                           // wenn ich das richtig verstehe...

dataGrid.columns = new Array( dgCol1dgCol2 );


// Fill the DataGrid 
arrayCollection = new ArrayCollection();
            
for(
i=0i<5i++) {
    
// Create the items for the DataGrid
    
dataItem:Object = new Object();
    
dataItem.field1 "Testinhalt "+i;
    
dataItem.field2 = new MeinAnzeigeObject();
    
    
// Add the items to the ArrayCollection
    
arrayCollection.addItemdataItem );
    
}

dataGrid.dataProvider arrayCollection
Das Problem ist nun das ich eben diesen eigenen itemRenderer benötige um das "MeinAnzeigeObject" (ein Canvas mit eigenem Inhalt) anzeigen zu können. Weiß jemand wie sich das am einfachsten machen lässt?
stnswz ist offline   Mit Zitat antworten
Alt 11-08-2008, 18:17   #2 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Lass deine Komponente das IFactory Interface implementieren und übergib dann das Class Objekt deiner IFactory.

PS: wenn es viele Canvas Instanzen werden, solltest du auf ein schmaleres Objekt umschwenken.
Omega Psi ist offline   Mit Zitat antworten
Alt 11-08-2008, 18:32   #3 (permalink)
GelegenheitsUser
 
Registriert seit: Jul 2004
Ort: Berlin
Beiträge: 114
Hi Omega

Vielen dank. Ja ich dachte mir schon das ich sowas in der Art mit der IFactory machen muss. Allerdings wie sieht das genau aus? Speziell die übergabe des Class Objekts an die IFactory... In IFactory gibts ja dann auch noch die methode newInstance() welche ausprogrammiert werden muss. Was genau kommt denn dann da rein?
stnswz ist offline   Mit Zitat antworten
Alt 11-08-2008, 18:34   #4 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Ich hab die ClassFactory vergessen, die kannst du auch nehmen.
Omega Psi ist offline   Mit Zitat antworten
Alt 11-08-2008, 18:57   #5 (permalink)
GelegenheitsUser
 
Registriert seit: Jul 2004
Ort: Berlin
Beiträge: 114
Hmm, ich hab jetzt folgendes gemacht was mir allerdings einen Runtime Error beschert, das problem liegt wohl darin das meine Klasse "MeinAnzeigeObject" im Konstruktor parameter mitbekommt...

PHP-Code:
dgCol2 = new DataGridColumn("Spalte 2");
dgCol2.dataField="field2";
dgCol2.itemRenderer = new ClassFactoryMeinAnzeigeObject );

// Fill the DataGrid 
arrayCollection = new ArrayCollection();
            
for(
i=0i<5i++) {

    
dataItem.field2 = new MeinAnzeigeObject(param1param2);
    
arrayCollection.addItemdataItem );
    
}

dataGrid.dataProvider arrayCollection
Wie lässt sich das auch mit Parametern im Konstruktor der Klasse lösen?
stnswz ist offline   Mit Zitat antworten
Alt 11-08-2008, 19:17   #6 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Implementiere das Interface IFactory in deinem ItemRenderer:
ActionScript:
  1. package {
  2.  
  3.     import mx.core.IFactory;
  4.  
  5.     public class MyClass implements IFactory {
  6.  
  7.         public function MyClass() { }
  8.  
  9.         public function newInstance() {
  10.             return new MyClass();
  11.         }
  12.     }
  13. }
Der ItemRender muss natürlich von UIComponent oder einer abgeleiteten Klasse erben.

Das ist aber auch einer der Gründe, warum man eher parameterlose Konstruktoren verwendet.
Omega Psi ist offline   Mit Zitat antworten
Alt 11-08-2008, 19:42   #7 (permalink)
GelegenheitsUser
 
Registriert seit: Jul 2004
Ort: Berlin
Beiträge: 114
Ich hab das mit der ClassFactory soweit hinbekommen indem ich mir ne einfache Klasse "ItemRendererDummy" geschrieben habe:

PHP-Code:
public class ItemRendererDummy extends Canvas
{
    public function 
ItemRendererDummy()
    {
        
super();
        
this.width 100this.height 30;
        
this.setStyle("backgroundColor"0x000000);
    }
    
    public function 
init(myObject:MeinAnzeigeObject):void {
        
addChild(myObject);
    }

Um das "MeinAnzeigeObject" in den DataGrid reinzubekommen mache ich dann folgendes (was jedoch nicht wirklich funktioniert):

PHP-Code:
dgCol2 = new DataGridColumn("Spalte 2");
dgCol2.dataField="field2";
dgCol2.itemRenderer = new ClassFactoryItemRendererDummy );

// Fill the DataGrid 
arrayCollection = new ArrayCollection();
            
for(
i=0i<5i++) {
    
dataItem:Object = new Object(); 
    var 
irDummy:ItemRendererDummy = new ItemRendererDummy();
    
irDummy.init( new MeinAnzeigeObject(param1param2) );
    
dataItem.field2 irDummy;

    
arrayCollection.addItemdataItem );
}
dataGrid.dataProvider arrayCollection
Das Ergebnis ist das der schwarze Canvas des "ItemRendererDummy" im DataGrid erscheint, allerdings nich das anschließend über die function init() hinzugefügte "MeinAnzeigeObject"... Woran kann das liegen?
stnswz ist offline   Mit Zitat antworten
Alt 11-08-2008, 19:53   #8 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Du übergibst ja auch keine Instanzen. Du müsstest das schon im Konstruktor von ItemRendererDummy implementieren.
Omega Psi ist offline   Mit Zitat antworten
Alt 12-08-2008, 13:04   #9 (permalink)
GelegenheitsUser
 
Registriert seit: Jul 2004
Ort: Berlin
Beiträge: 114
Hallo Omega,

Also ich hab jetzt nochmal rumprobiert und bekomm es einfach nicht hin so wie ich es brauche. Mein Problem ist das ich den zusammenhang zwischen der itemRender zuweisung und dem anschließenden füllen des renderers mit Daten nicht verstehe. Ich hab das jetzt mit IFactory probiert, aber das was hier passiert macht für mich gar keinen Sinn. Mein eigener ItemRenderer implementiert nun die IFactory und dann übergebe ich das Teil and den GridColumn für den DataGrid:
PHP-Code:
dgCol2 = new DataGridColumn("Spalte 2");
dgCol2.dataField="field2";
dgCol2.itemRenderer = new ItemRendererDummyparam1param2 ); 
Im nächsten Schritt sollen aber auch für jede Zeile die Daten in das Ding rein, daher:
PHP-Code:
for(...) {
    
dataItem.field2 = new ItemRendererDummyparam1param2 );
    ...

Und natürlich erzeuge ich damit neue Instanzen, da ich doch für jede Zeile eine neue brauche und nicht in jeder Zeile das gleiche anzeigen will ????? Nur funktioniert das so leider nicht, es wird immer nur der ItemRendererDummy aus der obigen zuweisung

"dgCol2.itemRenderer = new ItemRendererDummy( param1, param2 );"

angezeigt. Und das ist so doch dann völlig sinnlos. Wie bekomme ich denn die nötigen (VERSCHIEDENEN) Daten (welche ich erst in der for schleife zur verfügung habe) in den renderer rein?
stnswz ist offline   Mit Zitat antworten
Alt 12-08-2008, 13:30   #10 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Was sind das denn für Daten?
Omega Psi ist offline   Mit Zitat antworten
Alt 12-08-2008, 13:36   #11 (permalink)
GelegenheitsUser
 
Registriert seit: Jul 2004
Ort: Berlin
Beiträge: 114
Es ist ein dragbarer Canvas der jeweils 2 verschiedene Bilder (oder auch nicht, abhängig von den parametern im konstruktor), sowie verschiedenen Text anzeigen soll. Wie gesagt, in jeder Zeile ein anderer. Hier im Post hab ich das Ding daher immer "MeinAnzeigeObject" genannt...
stnswz ist offline   Mit Zitat antworten
Alt 12-08-2008, 13:42   #12 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Wie gesagt, für sowas ist in ein Canvas eigentlich viel zu überdimensioniert... aber das ist ein anderes Kapitel. Wie soll denn darüber entschieden werden welche Bilder angezeigt werden? Wo kommen die Infos dafür her?
Omega Psi ist offline   Mit Zitat antworten
Alt 12-08-2008, 13:51   #13 (permalink)
GelegenheitsUser
 
Registriert seit: Jul 2004
Ort: Berlin
Beiträge: 114
Die Infos dafür erhalte ich eben im Konstruktor des AnzeigeObjekts (der dragbare Canvas). Nochmal zum Verständnis wie ich mir das gedacht hatte:

PHP-Code:
// Den Renderer für die Datenzelle erzeugen:
dgCol2 = new DataGridColumn("Spalte 2");
dgCol2.dataField="field2";
dgCol2.itemRenderer = new MeinEigenerRenderer();

// Mein AnzeigeObjekt anhand der paramter erzeugen und der Datenzelle Übergeben
arrayCollection = new ArrayCollection();
for(...) {
    
dataItem.field2 = new MeinAnzeigeObjectparam1param2 );
    ...
    
arrayCollection.addItemdataItem ); 

dataGrid.dataProvider arrayCollection
stnswz ist offline   Mit Zitat antworten
Alt 12-08-2008, 14:08   #14 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Aber wo kommen die Daten dafür her. ItemRenderer können in Abhängigkeit ihrer Items und auch der dataField Eigenschaft der DataGridColumn das Verhalten ändern. Dafür musst du aber die Klasse umschreiben.
Omega Psi ist offline   Mit Zitat antworten
Alt 12-08-2008, 14:27   #15 (permalink)
GelegenheitsUser
 
Registriert seit: Jul 2004
Ort: Berlin
Beiträge: 114
Die Daten für mein AnzeigeObjekt erhalte ich aus einer XML Datei deren Inhalt ich parse und daraus dann eine ArrayCollection erzeuge welche ich als dataProvider für den DataGrid benutze. Das sieht vereinfacht dann so aus:

PHP-Code:
arrayCollection = new ArrayCollection();
for(
i=0i<5i++) {
    
dataItem = new Object()
    
dataItem.field1 "Testfield1 "+i;
    
    
// Hier soll der Canvas in die zelle (die daten für die parameter hab ich aus dem geparsten XML) 
    
dataItem.field2 = new MeinAnzeigeObjectparam1param2 );  
    
    
dataItem.field3 "Testfield3 "+i;
    ...
    
arrayCollection.addItemdataItem ); 

dataGrid.dataProvider arrayCollection
Warum ist das denn so kompliziert für jede Zeile einen eigenen Canvas in die Datenzelle zu bekommen? Ich hab schon eineige beispiele gesehen konnte sie aber nicht nachvollziehen da diese alle mit mxml gemacht sind und da läuft das alles irgendwie anders...
stnswz ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele