显示时调整 DataGrid 的大小

Posted

技术标签:

【中文标题】显示时调整 DataGrid 的大小【英文标题】:Resize DataGrid When Shown 【发布时间】:2011-08-29 00:09:59 【问题描述】:

我正在尝试编写我的 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)并且调整大小什么都不做

【问题讨论】:

你能给我们更多的信息吗?你如何保存“大小”?你什么时候创建网格?你怎么知道它正在正确保存? 【参考方案1】:

几个想法:

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

【讨论】:

其实这不是评论。根据对问题的不完全了解,有四个建议的答案。 所以解决方案是调整列的大小,而不是在创建完成期间,而是在用户切换到任何给定网格时。非常烦人,因为我必须跟踪用户是否是第一次切换 - 但它完成了工作。【参考方案2】:

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

// 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();

【讨论】:

以上是关于显示时调整 DataGrid 的大小的主要内容,如果未能解决你的问题,请参考以下文章

UIKeyBoard 在方向更改为横向时调整大小

当边界 UICollectionView 更改时调整单元格大小

使用“大小”参数时调整散点图中的标记大小

选择时调整单元格大小时出现 NSAutoResizingMaskLayoutConstraint 错误

UIPageViewController 没有在旋转时调整其子视图控制器的大小

如何在移动时调整 UIView 的大小,就像 SnapGuide 一样?