我正在尝试编写我的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)并且调整大小什么都不做
答案 0 :(得分:1)
一些想法:
creationComplete()
事件触发数据网格时,你能声明像resizeDataGrid()这样的方法吗?如果您在TabNavigator中使用数据网格,则默认创建策略是延迟组件创建,直到用户使用该组件为止(例如,使标签处于活动状态)。SharedObject
存储数据网格宽度可能是最佳选择。 答案 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();
}