Ich versuche, ein Datagrid zu erstellen, das die Größe vertikal ändert, um sicherzustellen, dass alle Renderer vollständig angezeigt werden. ZusätzlichFlex - Problem mit der automatischen Größenänderung von Datagrid
- Renderers von variabler Höhe
- Renderers sich können die Größe
Im Allgemeinen ist der Fluss der Ereignisse wie folgt:
- Einer der Renderer Artikel passt die Größe selbst (normalerweise als Reaktion auf einen Benutzerklick usw.)
- Es löst ein Sprudlereignis aus, das vom übergeordneten Datagrid ausgelöst wird
- Das DataGrid versucht, die Größe zu ändern, um sicherzustellen, dass alle Renderer vollständig sichtbar bleiben.
ich zur Zeit diesen Code innerhalb des Datagrid mit der Höhe zu berechnen:
height = measureHeightOfItems(0, dataProvider.length) + headerHeight;
Dies scheint eine falsche Höhe zu erhalten. Ich habe eine Reihe von Varianten einschließlich callLater versucht (um sicherzustellen, dass die Größenänderung abgeschlossen wurde, so dass die Messung korrekt funktionieren kann), meausre() außer Kraft setzen und invalidateSize()/validateSize() aufrufen, aber keiner funktioniert.
Im Folgenden sind 3 Klassen, die das Problem veranschaulichen werden. Durch Klicken auf die Schaltfläche in den Elementrenderern wird die Größe des Renderers geändert. Das Raster sollte ebenfalls erweitert werden, sodass alle drei Renderer vollständig angezeigt werden.
Alle Vorschläge würden sehr geschätzt werden.
Grüße
Marty
DataGridProblem.mxml (Application-Datei)
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
xmlns:view="view.*">
<mx:ArrayCollection id="dataProvider">
<mx:String>Item A</mx:String>
<mx:String>Item B</mx:String>
<mx:String>Item C</mx:String>
</mx:ArrayCollection>
<view:TestDataGrid
id="dg"
dataProvider="{ dataProvider }"
width="400">
<view:columns>
<mx:DataGridColumn dataField="text" />
<mx:DataGridColumn itemRenderer="view.RendererButton" />
</view:columns>
</view:TestDataGrid>
</mx:Application>
view.TestDataGrid.as
package view
{
import flash.events.Event;
import mx.controls.DataGrid;
import mx.core.ScrollPolicy;
public class TestDataGrid extends DataGrid
{
public function TestDataGrid()
{
this.verticalScrollPolicy = ScrollPolicy.OFF;
this.variableRowHeight = true;
this.addEventListener(RendererButton.RENDERER_RESIZE , onRendererResize);
}
private function onRendererResize(event : Event) : void
{
resizeDatagrid();
}
private function resizeDatagrid():void
{
height = measureHeightOfItems(0, dataProvider.length) + headerHeight;
}
}
}
view.RendererButton.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Button width="50" height="50"
click="onClick()" />
<mx:Script>
<![CDATA[
public static const RENDERER_RESIZE : String = "resizeRenderer";
private function onClick() : void
{
this.height += 20;
dispatchEvent(new Event(RENDERER_RESIZE , true));
}
]]>
</mx:Script>
</mx:HBox>
d'oh ... es muss einen Weg geben, damit das funktioniert. – DyreSchlock