2 Stimmen

Flex DataGrid mit Zeilennummernspalte

Ich möchte die DataGrid-Komponente so erweitern, dass es eine (schreibgeschützte) Spalte für die Zeilennummer gibt, wie man sie in Tabellenkalkulationen sieht. Ich bin auf diesen Artikel gestoßen http://www.cflex.net/showFileDetails.cfm?ObjectID=735 aber es hängt davon ab, dass die Daten für jede Zeile eindeutig sind, so dass es in das Array indizieren kann. Wenn die Daten nicht eindeutig sind (wie bei einem leeren Raster), funktioniert es nicht. Wie kann ich das implementieren?

2voto

Matt Punkte 21

Das hat bei mir funktioniert:

<mx:Label xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
    <![CDATA[
        import mx.controls.AdvancedDataGrid;

        private var handleDataChangedEnabled:Boolean = false;

        override public function set data(value:Object):void {
            super.data = value;

            if (!handleDataChangedEnabled) {
                addEventListener("dataChange", handleDataChanged);
            }
        }

        public function handleDataChanged(event:Event):void {
            this.text = String(listData.rowIndex + (listData.owner as AdvancedDataGrid).verticalScrollPosition + 1);
        }
    ]]>
</mx:Script>

Natürlich müssten Sie AdvancedDataGrid in DataGrid ändern.

Zum Wohl.

0voto

acromm Punkte 850

Stellen Sie sicher, dass der dataProvider eine eindeutige Spalte oder Eigenschaft hat, und zeigen Sie diese Spalte/Eigenschaft nicht an, wenn Sie das nicht wollen. Der Schlüssel ist der dataProvider

0voto

Freddie Zero Punkte 1

Verwenden Sie einfach diese Klasse als Ihren itemRenderer: RowNumColumnRenderer.as

package
{
    import mx.collections.IList;
    import mx.controls.AdvancedDataGrid;
    import mx.controls.Label;
    import mx.controls.listClasses.ListBase;

    public class RowNumColumnRenderer extends Label
    {
        override public function set data(value:Object):void
        {
            super.data = value;
            if (listData != null)
                this.text = (AdvancedDataGrid(listData.owner).itemRendererToIndex(this) + 1).toString();
        }
    }
}

-1voto

philcruz Punkte 7765

Ich konnte dies durch die Implementierung eines benutzerdefinierten itemRenderer, RowNumberRenderer.as, erreichen

package com.domain
{
    import mx.collections.IList;
    import mx.controls.Label;
    import mx.controls.listClasses.ListBase;

    public class RowNumberRenderer extends Label
    {
        public function RowNumberRenderer()
        {
            super();
        }

        override public function set data(value:Object):void
        {
            super.data = value;
            this.text = String(IList(ListBase(listData.owner).dataProvider).getItemIndex(data) + 1);                     
        }

    }
}

-1voto

Alex Lee Punkte 1

Wie wäre es mit folgendem:

RendererRowIndexPlusOne.as 
package
{
    import mx.controls.Label;
    import mx.utils.StringUtil;
    import mx.utils.ObjectUtil; 

    public class RendererRowIndexPlusOne extends Label
    {   
        public override function set data(item:Object):void {
            super.data = item; 

            trace('listData.label ' + listData.label);
            trace('listData.rowIndex ' + listData.rowIndex);
            trace('listData.columnIndex ' + listData.columnIndex);
            trace('listData.owner ' + listData.owner);

            text = String(listData.rowIndex + 1);
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X