Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   DataGrid ItemRenderer переменной высоты. Функц measureHeightOfItems мешает скроллбар (http://www.flasher.ru/forum/showthread.php?t=131145)

chabapok 13.10.2009 21:55

DataGrid ItemRenderer переменной высоты. Функц measureHeightOfItems мешает скроллбар
 
Конечная задача - получение таблицы, высота которой такова, что нет скроллбара. (но и не больше)

В этой таблице у меня свой ItemRendeder, который тоже разной высоты - в зависимости от кол-ва текста.

Проблема состоит в том, что когда я вызываю measureHeightOfItems(), то (предположительно) он считает как будто скроллбар есть, даже если verticalScrollPolice=off и изначальная высота таблицы больше, чем требуется.
При этом высота контента чуток больше получается т.к. скроллбар влияет на ширину контента.
Дальше я присваиваю таблице подсчитанное свойство height При этом высота таблицы уже такая получается, что скроллбар не нужен, а раз так, то контент в таблице шире, и поэтому его высота меньше. И таблица получается внизу с пустым местом. :mad:

я сделал в ItemRendeder распечатку высоты и вижу, что когда вызывается measureHeightOfItems(), то высота у проблемного элемента одна. А когда я таблице присваиваю свойство height и начинается ее рендер, то на распечатке видно, что высота уже другая.

это фрагмент itemRenderer-а
Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
        verticalScrollPolicy="off" horizontalScrollPolicy="off"
        height="{ measureH(data) }"
        width="400"  borderStyle="solid">
<mx:Script>
        <![CDATA[
 
        private function measureH(data:Object):int{
                comment.executeBindings(true);//comment - это TextArea
                comment.validateNow();
                comment.height=10+comment.textHeight;
                var h:int=((26+comment.height)>110)? (30+comment.height):110;
                tr.add("ir h="+h);//это вывод в мою консоль всего-лишь
                return h;
        }

а так я делаю с таблицей:

Код AS3:

        private function onCommentsLoadOk():void{
                var myxml:XML = commentsProvider.lastResult as XML;
                var cmt:comment_m;
                var source:XML;
                comments=new ArrayCollection();
                for(var i:int=0; i<myxml.comment.length(); i++){
                        cmt = new comment_m();
                        source=myxml.comment[i];
                        cmt.setDatas(source);
                        comments.addItemAt( (cmt as Object),0 );
                }
                commentsTable.executeBindings(true);       
                commentsTable.validateNow();               
                this.callLater(setHeights);
}
 
        private function setHeights():void{
                tr.add("start measuring");//это вывод в мою консоль
                var h:int=commentsTable.measureHeightOfItems(0,comments.length)+1;
                tr.add("h="+h+" l="+comments.length);
                var neededH:int=(h>3000) ? 3000:h;
                tr.add("needh="+neededH);
                if (commentsTable.height != neededH)
                        commentsTable.height=neededH;
                if (h>3000)
                        commentsTable.verticalScrollPolicy='on';
                else
                        commentsTable.verticalScrollPolicy='off';
        }
 
...
//в таблице height заведомо большое, и скроллбар выключен. Не помогает.
<mx:DataGrid id="commentsTable"
        width="100%"
        dataProvider="{comments}"                                                       
        variableRowHeight="true" wordWrap="true"
        height="4000" verticalScrollPolicy="off"
        headerHeight="1">

Добавлено через 52 часа 15 минут
Я нашел в чем было дело. скроллбар не при чем. У меня в itemRenderer comment задано было так:

Код AS3:

<mx:TextArea top="47" 
                text="{data.text}" verticalScrollPolicy="off" horizontalScrollPolicy="off"
                left="110" right="5"
                id="comment" editable="false" wordWrap="true" width="443"/>

Проблема заключалась в строчках left="110" right="5". При пересчете comment.textHeight оно их не валидировало, поэтому ширина comments была не той, которая нужна. Заменил эти строчки на правильное значение witdh - заработало.


Часовой пояс GMT +4, время: 18:22.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.