2014-11-07 2 views
1

Надеюсь, кто-то может мне помочь здесь. У меня есть DataGrid, который использует пользовательские itemrenderers. Все работает отлично, за исключением одного типа itemrenderers, где многострочный текст задается в более поздней точке (он поступает из базы данных в зависимости от некоторых условий). В этом случае текст становится многострочным, как и должен, но высота строки не увеличивается, поэтому текст перекрывает следующую строку.Flex: принудительно перерисовать DataGrid при изменении текста в пользовательских itemrenderers

Если я изменяю размер столбца, ряды изменяются до нужного размера (поскольку текст уже есть, а метка имеет правильную высоту). Также, если я прокручиваю вниз, это выглядит хорошо.

Как я могу заставить изменить размер строки до нужной высоты после того, как текст был установлен?

Я пробовал почти все - validateNow() на itemrenderer и datagrid после того, как я получу новую высоту ярлыка и еще много чего.

Я знаю, что хорошим способом было бы выполнить sql-запросы перед передачей данных в datagrid, но это динамический блок метаданных и довольно сложный. Должен быть способ просто перерисовать DataGrid?

Он работал хорошо с более ранними версиями SDK, но не с моей новой установки (Flex SDK 4,13 + AIR 14)

Вот код для DataGrid:

<s:DataGrid id="dG" 
        variableRowHeight="true" 
        creationComplete="dgCreation()" 
        width="100%" 
        height="100%" 
        dataProvider="{theDataProvider}" 
        doubleClickEnabled="true" 
        initialize="dG.grid.rowBackground = dG.alternatingRowColorsBackground" 
        selectionChanging="dG_selectionChangingHandler(event)"> 

    <SMT:columns> 
     <s:ArrayList> 
     </s:ArrayList> 
    </SMT:columns> 

</s:DataGrid> 

И ItemRenderer:

<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       textAlign="left"> 
<fx:Script> 
    <![CDATA[ 

     override public function set label(value:String):void 
     { 

      // do the sql lookup here 

     } 

     //responder from async dbCall 
     public function onLookupComplete(result:SQLResult):void 
     {    
       myContent.text = resultString; 
     } 

    ]]> 
</fx:Script> 

<s:Label id="myContent" 
     left="5" 
     top="9" 
     text="" 
     maxDisplayedLines="5" 
     lineBreak="toFit" 
     verticalAlign="top" 
     width="100%"/> 
</s:GridItemRenderer> 

Большое спасибо за ваше время!

ответ

0

Ну, оказалось гораздо проще, чем я думал. Я пробовал validateDisplayList(), но мне нужен invalidateDisplayList() в DataGrid (там есть некоторые вещи).

Код для ItemRenderer:

override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void 
{ 
    super.updateDisplayList(unscaledWidth, unscaledHeight); 

    // force the grid to re-render again 
    column.grid.invalidateDisplayList(); 
} 
0

Я заметил, что обработка данных, поступающих из БД в обработчик/обратный вызов службы, приводит к странному поведению. Решением для меня было использование метода «callLater».

Может быть, это помогает, если вы изменить ваш обработчик в визуализатора, как это:

//responder from async dbCall 
public function onLookupComplete(result:SQLResult):void 
{    
    callLater(function():void{myContent.text = resultString;}); 
} 
+0

К сожалению, это не поможет в моем случае. Я также попытался установить текстовое прохождение commitProperties(), неважно, как я его установил, размер рендеринга по-прежнему не сбрасывается. Мне нужен способ заставить datagrid повторно отобразить каким-то образом. – Philarmon

Смежные вопросы