Zurück   Flashforum > Flex und AIR > Flex programmieren

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 07-06-2011, 13:24   #1 (permalink)
Neuer User
 
Registriert seit: Sep 2006
Beiträge: 620
Drag beschränken im DataGrid

Hallo Zusammen.

Ich habe gerade ein Problem mit meinem Datagrid in verbindung mit Drag&Drop und bei Tante Goolge kann ich dazu nichts finden

Es geht um Folgendes: Ich habe ein DataGrid mit diversen Spalten. In meiner ersten Spalte befindet sich ein Bild. Nun möchte ich, dass man die Spalte nur dann verschieben kann wenn man dieses Bild zum verschieben nutzt.
Momentan kann ich überall in der Zeile (also egal welche Spalte) anklicken und die gesammte Zeile verschieben.

Mein Programm ist momentan folgendermaßen aufgebaut:
Mein Ausgangs-DataGrid hat die Eigenschaft dragEnabled="true"

Mein Ziel-DataGrid hat die Eigenschaft dropEnabled = "true" und einen DragDrop-Listener der die Daten annimmt.
(Beide DataGrids wurden als Komponente in MXML angelegt)

Um mein Problem anzugehen muss ich ja schon bei dem Ausgangs-DataGrid anfangen?! Deswegen hatte ich mir überlegt, dass ich dem DataGrid den Listener dragStart-Event hinzufüge um abzufragen welche Spalte versucht wird zu verschieben und des dann zu verhindern.
Allerdings schaffe ich es nicht die Spalte des DragEvents zu bekommen. Das DragEvent hat ja die Eigenschaft actualColIndex. Diese Eigenschaft müsste doch eigentlich die Richtige sein?! Bei mir ist sie nur immer "0".

Wie kann man nun verhindern, dass man ein beliebiges Element des DataGrids verschieben kann?
Am Besten wäre es, wenn ich über die Eigenschaften des DataGrids verhindern könnte.

Hatte jemand schonmal das Problem und kann mir weiterhelfen?

MfG Monk

p.s. wenn weitere Informationen benötigt werden reiche ich diese gerne nach. Ich schreibe auch auch Beispielprogramm falls nötig
__________________
Flash CS5 / Flex 3 / Flashdevelop / FB 4.6
dr monk ist offline   Mit Zitat antworten
Alt 29-06-2011, 12:16   #2 (permalink)
Neuer User
 
Registriert seit: Sep 2006
Beiträge: 620
Ich greife einfach mal mein altes Topic auf da es noch damit zu tun hat.

Vorgeschichte:
Mein DataGrid hat für jede Spalte einen ItemRender. Allerdings verursacht ein ItemRenderer folgenden Fehler: sobald dieser zugewiesen ist kann man die Zeile nur noch über das Element in der ersten Spalte aktivieren.
Daraus ergibt sich das Problem, dass man Einträge entweder über nur über das erste Element ziehen kann oder erst über dieses mit der Maus fahren muss.

Wenn man die Zeile weiter hinten "anpackt" und verschieben möchte nimmt er als Drag-Objekt das Element was als letztes mit der Maus überfahren wurde.

Wenn man noch kein "erstes Element" aktiviert hat gibt es leere Daten.

Problem:
Dieser ItemRenderer verhindert die normalen DataGrid-Auswahl Eigenschaften:
PHP-Code:
package renderer 
{

    
import mx.containers.VBox;
    
import mx.controls.Label;
     
    public class 
AnzahlRenderer extends VBox
    
{
        
        
        public function 
AnzahlRenderer():void
        
{
            
super();
            
        }
        
        private var 
_daten:Object = new Object();
        
override public function set data (value:Object):void {
            
this.removeAllElements();
            
            
_daten value;
            
            if (
_daten.anzahl90 != "0") {    
                var 
anzahl90er:Label = new Label();
                
anzahl90er.text _daten.anzahl90;
                
addChild(anzahl90er);
            }
            
            if (
_daten.anzahl100 != "0") {    
                var 
anzahl100er:Label = new Label();
                
anzahl100er.text _daten.anzahl100;
                
addChild(anzahl100er);
            }
            
            if (
_daten.anzahl110 != "0") {    
                var 
anzahl110er:Label = new Label();
                
anzahl110er.text _daten.anzahl110;
                
addChild(anzahl110er);
            }
            
            if (
_daten.anzahl120 != "0") {    
                var 
anzahl120er:Label = new Label();
                
anzahl120er.text _daten.anzahl120;
                
addChild(anzahl120er);
            }
            
            if (
_daten.anzahl160 != "0") {    
                var 
anzahl160er:Label = new Label();
                
anzahl160er.text _daten.anzahl160;
                
addChild(anzahl160er);
            }
        }

    }


Ich habe diesen ItemRenderer auch mit den anderen Renderern verglichen finde aber keinen Fehler. Ich versuche mal den Fehler in einem seperaten Test-Projekt zu rekonsturieren falls das Problem nicht ohne weiteres erkennbar ist (man weiß ja nie - ich übersehe öfters mal was )

MfG Monk

EDIT: Hier mal ein Beispielprogramm bei dem man das "Phänomen" gut erkennen kann:

PHP-Code:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    creationComplete="appStart()">
    <mx:Script>
        <![CDATA[
        import mx.core.ClassFactory;

        public function appStart():void {
            
            myDataGrid.columns[0].dataField = "name";
            myDataGrid.columns[0].headerText = "Name";
            
            myDataGrid.columns[1].dataField = "anzahl";
            myDataGrid.columns[1].headerText = "Anzahl";
            myDataGrid.columns[1].itemRenderer = new ClassFactory(AnzahlRenderer);
        }

        ]]>
    </mx:Script>
    
    <mx:DataGrid id="myDataGrid" dataProvider="{daten}" dragEnabled="true" allowMultipleSelection="true" />
    
    <mx:ArrayCollection id="daten">
            <mx:Object name="test 1" anzahl="0" />
            <mx:Object name="test 2" anzahl="3"/>
            <mx:Object name="test 3" anzahl="15"/>
            <mx:Object name="test 4" anzahl="50" />
        </mx:ArrayCollection>
        
</mx:Application>
Und die AnzahlRenderer.as
PHP-Code:
package  
{
    
import mx.containers.VBox;
    
import mx.controls.Label;
     
    public class 
AnzahlRenderer extends VBox
    
{  
        public function 
AnzahlRenderer():void
        
{
            
super();    
        }
        
        private var 
_daten:Object = new Object();
        
override public function set data (value:Object):void {
            
this.removeAllElements();
            
            
_daten value;
            
            if (
_daten.anzahl != "0") {    
                var 
anzahlLabel:Label = new Label();
                
anzahlLabel.text "->"+_daten.anzahl;
                
addChild(anzahlLabel);
            }
        }
    }

Die Namen funktionieren wie gewohnt, die Anzahl verursacht probleme (und reicht diese an alle folgenden Spalten weiter).
__________________
Flash CS5 / Flex 3 / Flashdevelop / FB 4.6

Geändert von dr monk (29-06-2011 um 12:33 Uhr) Grund: EDIT: Beispielprogramm hinzugefügt
dr monk ist offline   Mit Zitat antworten
Alt 30-06-2011, 06:02   #3 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.146
Was ich nicht verstehe:
wieso implementierst du das Ding nicht LiveCycle konform, so wie schon in so manchen von mir gezeigten Beispielen illustriert? Das wäre dann wesentlich performanter, denn die Labels werden nur einmal gebaut, nicht bei jedem setzen von data. Leichter zu debuggen wäre es auch.

Ich hab keine Idee, was removeAllChildren für Seiteneffekte auslöst, die sich auf das DnD auswirken könnte.
Omega Psi ist offline   Mit Zitat antworten
Alt 30-06-2011, 09:39   #4 (permalink)
Neuer User
 
Registriert seit: Sep 2006
Beiträge: 620
Problem gelöst ;-)

Mit folgendem Code funktioniert es. Ich habe super.data value zuweisen und die entsprechenden stellen mit data erstezen müssen.

PHP-Code:
package  
{
    
import mx.containers.VBox;
    
import mx.controls.Label;
     
    public class 
AnzahlRenderer extends VBox
    
{  
        public function 
AnzahlRenderer():void
        
{
            
super();    
        }
        
        
override public function set datavalue:Object ) : void {
            
this.removeAllElements();
            
            
super.data value;    // damit funktioniert es
            
            
if (data.anzahl != "0") {    
                var 
anzahlLabel:Label = new Label();
                
anzahlLabel.text "->"+data.anzahl;
                
addChild(anzahlLabel);
            }
        }
    }

removeAllElements(); muss ich deswegen verwenden da es bei meinem Code sonst dazu führen würde, dass sich Elemente beim scrollen verdoppeln (wenn sie ausserhalb des Sichbereichs sind und wieder angezeigt werden).
Das ist wahscheinlich genau die Schwachstelle bei dem Code die Omega Psi gemeint hat.

Ich habe bisher keine Fehler beim Drag and Drop feststellen können wenn ich die Items mit addChild() hinzufüge.

Ich habe ja noch den Code von dem Vorschau-Renderer . Wahrscheinlich sollte ich meine anderen Item-Renderer auch nach diesem Vorbild aufbauen.
Vorerst reicht die Funktion so aber erstmal

Danke nochmal an Omega Psi der, nicht nur mir, immer so gut hilft

MfG Monk
__________________
Flash CS5 / Flex 3 / Flashdevelop / FB 4.6
dr monk ist offline   Mit Zitat antworten
Alt 30-06-2011, 16:27   #5 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.146
Die Schwachstelle liegt bei deinem Code an ganz anderen Stellen, wenn ich ganz ehrlich sein soll.
Omega Psi 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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Drag & Drop dataGrid Argomix Flex programmieren 8 10-06-2010 12:55
DataGrid Drag&Drop Slashwalker Flex programmieren 1 04-05-2008 02:37
Drag beschränken howoto? D@luxe ActionScript 1 37 08-03-2006 13:41
DataGrid mit Drag und Drop anothermike Komponenten und SmartClips 1 17-02-2005 11:39
drag beschränken Christian23 Flash 4 und Flash 5 4 27-03-2002 12:46


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

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


Copyright ©1999 – 2012 Marc Thiele