chabapok
13.10.2009, 21:55
Конечная задача - получение таблицы, высота которой такова, что нет скроллбара. (но и не больше)
В этой таблице у меня свой ItemRendeder, который тоже разной высоты - в зависимости от кол-ва текста.
Проблема состоит в том, что когда я вызываю measureHeightOfItems(), то (предположительно) он считает как будто скроллбар есть, даже если verticalScrollPolice=off и изначальная высота таблицы больше, чем требуется.
При этом высота контента чуток больше получается т.к. скроллбар влияет на ширину контента.
Дальше я присваиваю таблице подсчитанное свойство height При этом высота таблицы уже такая получается, что скроллбар не нужен, а раз так, то контент в таблице шире, и поэтому его высота меньше. И таблица получается внизу с пустым местом. :mad:
я сделал в ItemRendeder распечатку высоты и вижу, что когда вызывается measureHeightOfItems(), то высота у проблемного элемента одна. А когда я таблице присваиваю свойство height и начинается ее рендер, то на распечатке видно, что высота уже другая.
это фрагмент itemRenderer-а
<?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;
}
а так я делаю с таблицей:
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 задано было так:
<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 - заработало.
В этой таблице у меня свой ItemRendeder, который тоже разной высоты - в зависимости от кол-ва текста.
Проблема состоит в том, что когда я вызываю measureHeightOfItems(), то (предположительно) он считает как будто скроллбар есть, даже если verticalScrollPolice=off и изначальная высота таблицы больше, чем требуется.
При этом высота контента чуток больше получается т.к. скроллбар влияет на ширину контента.
Дальше я присваиваю таблице подсчитанное свойство height При этом высота таблицы уже такая получается, что скроллбар не нужен, а раз так, то контент в таблице шире, и поэтому его высота меньше. И таблица получается внизу с пустым местом. :mad:
я сделал в ItemRendeder распечатку высоты и вижу, что когда вызывается measureHeightOfItems(), то высота у проблемного элемента одна. А когда я таблице присваиваю свойство height и начинается ее рендер, то на распечатке видно, что высота уже другая.
это фрагмент itemRenderer-а
<?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;
}
а так я делаю с таблицей:
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 задано было так:
<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 - заработало.