显示时调整DataGrid的大小

时间:2011-05-19 15:37:56

标签: flex actionscript-3 datagrid flex4

我正在尝试编写我的flex应用程序,以便在启动时恢复用户的设置。该应用程序有3个数据网格(任何时候只有一个在屏幕上可见),如果用户进行任何调整大小事件,我只需保存网格的状态。

保存状态非常有效,恢复时会出现问题。似乎只有可见的数据网格才能正确恢复。在所有其他网格上,宽度都是错误的,与我恢复的设置不匹配。

问题是,当应用程序启动时,数据网格的大小不正确。每个数据网格占据整个屏幕,但最初它们只有非常小的尺寸(即200宽度)

有没有办法强制数据网格在创建时正确调整大小?或者是否可以知道数据网格何时“最大化”我不想连接调整大小事件 - 如果可能的话 - 因为我会非常频繁地获取,我只想恢复一次设置。

这是我用来恢复列宽的代码:

var grid:DataGrid = ...;

... for each column ...
... parse width into width (ie. width is now "320")
// If it's in the config, it's visible
col.visible = true;
col.width = width;

... After loop ...
grid.invalidateSize();
grid.invalidateDisplayList();

编辑:

以下是您要求的信息:

  • 设置保存到数据库中(flex proejct连接到JBoss)。我只是用列的名称和宽度来保存CSV类型的东西。我知道这很有效,因为在应用程序启动时可见的一个数据网格的大小正确。

  • 是的,网格使用相对大小(即100%) - 我无法真正改变它,因为我希望网格占用其容器中的所有可用空间 - 我希望用户能够调整浏览器的大小并使其看起来正确。

  • 每个网格都包含在自己的Hbox

  • 数据网格是在应用程序启动时创建的 - 您只能看到其中一个。它们位于标签导航器类型的东西中,但它的创建策略设置为“全部”,因此它们可以填充数据(填充需要一些时间,通常用户会在前面的网格上停留一段时间。)

  • 我无法将我的调整大小的东西放在creationComplete处理程序中,因为我最终遇到了同样的问题。网格的大小在它创建后就像50(它应该是1000,页面宽度的100%) - 然后我去设置列的大小(显然> 50)并且调整大小什么都不做

2 个答案:

答案 0 :(得分:1)

一些想法:

  • 在CreationComplete()期间调整大小:您的数据网格何时被创建?当creationComplete()事件触发数据网格时,你能声明像resizeDataGrid()这样的方法吗?如果您在TabNavigator中使用数据网格,则默认创建策略是延迟组件创建,直到用户使用该组件为止(例如,使标签处于活动状态)。
  • 固定尺寸​​:您的数据网格是使用固定大小还是相对大小?数据网格或数据网格列的相对大小(例如width ='50%')在Flex中是错误的,最好的解决方法是设置datagrid和datagrid列的像素宽度
  • 存储用户首选项:您如何存储用户首选项?使用SharedObject存储数据网格宽度可能是最佳选择。
  • Spark容器:数据网格是如何包含的?例如,他们每个人都坐在VGroup中,还是根本不包含?我发现使用Spark布局工具(如VGroup)来包含数据网格可以改善数据网格布局问题。

答案 1 :(得分:1)

我们所做的是在初始化时从列宽度中保存,然后在重新渲染网格时重置宽度,这将在网格的第一次绘制和随后的调整大小时发生。 唯一的问题是它需要列可调整大小但不允许用户调整大小

// saves column width - this is intended to save width percent which
// will only be available on initialization, after that I beleive widths
// will be fixed size
private function saveOffColumnWidths(columns:ArrayCollection):void
{
    for each(var column:TDMSEDataGridColumn in columns)
    {
    originalColWidths.push(column.width);       
    }
}

// resets the column widths - the saved widths are assumed to be width percentages
private function resetColumnWidths():void
{
    dataGrid.columns[0].width=20; // set the check col seperately
    for (var pos:int=0; pos<dataGrid.columnCount-1;pos++ )
    {
    dataGrid.columns[pos+1].width = (dataGrid.width - 20) * originalColWidths[pos];
    }
} 

protected function dataGrid_renderHandler(event:Event):void
{
    resetColumnWidths();
}