如何访问另一个组件中一个 mxml 中的数据网格?

Posted

技术标签:

【中文标题】如何访问另一个组件中一个 mxml 中的数据网格?【英文标题】:how to access the datagrid in one mxml in another component? 【发布时间】:2010-12-05 05:38:21 【问题描述】:

我的 mxml 文件中有一个数据网格,例如 samp.mxml。

<mx:DataGrid id="taskDataGrid" dataProvider="initDG" variableRowHeight="true" 
    editable="true"   paddingBottom="1" paddingTop="1"  > 

<mx:columns>

      <mx:DataGridColumn dataField="Select" 
                editable="true" 
                rendererIsEditor="true" 
                itemRenderer="mx.controls.CheckBox" 
                editorDataField="selected" />

      <mx:DataGridColumn dataField="TaskName"
                
                editable="true" 
                rendererIsEditor="true" 
                itemRenderer="components.taskComponent"/> //i call the component.

      <mx:DataGridColumn dataField="TaskId"
                itemRenderer="mx.controls.TextInput" />     

 </mx:columns>
 </mx:DataGrid>

在数据网格的其中一列中,我必须显示一个文本输入框和一个按钮。所以我将该功能编写为一个单独的组件,即 taskComponent.mxml

 <mx:TextInput id="TaskName"
    editable="true" 
    text="data.TaskName" 
    mouseDown="addTaskRow(event);"    
   /> 

 <mx:Button id="searchTask" label="..."   click="showPopUp();"/>

现在,如果我单击组件中的文本输入框,我希望添加另一个数据行。早些时候我有它,如果我点击数据网格,就会添加一行。所以我在 samp.mxml 本身中编写了函数。这是添加数据网格行的功能。

private function addTaskRow(event:MouseEvent):void
        
            taskDataGrid.dataProvider.addItem(
                

                
            );
            taskDataGrid.height += 30; 

        

如果我尝试在 taskComponent 文件中编写函数,它会显示错误“未定义属性 taskDataGrid 的访问”。 taskComponent中的datagrid如何使用?

【问题讨论】:

【参考方案1】:

trace(this.owner); 添加到文本输入的 mouseDown 并查看它跟踪的内容。如果它跟踪 [object DataGrid] 之类的内容,您可以使用 DataGrid(this.owner) 访问 taskDataGrid。

【讨论】:

很抱歉打扰您,但我对 Flex 很陌生。我添加了 MouseDown="trace(this.owner);"。但是在哪里可以看到它的踪迹。我正在使用 FlexBuilder。 调试应用程序(按 F11)并单击文本输入。 Alt-tab 到 Flex Builder,进入窗口菜单并选择控制台。 (或者从 window|perspectives 中选择 flex 调试透视图)。将显示控制台面板。 我得到 iqa0.VBox4.taskPanel.taskDataGrid 我使用了 taskDataGrid(this.owner).dataProvider.addItem();... 我仍然得到“调用可能未定义的方法 taskDataGrid” 使用DataGrid(this.owner).dataProvider.addItem();括号()用于类型转换。这里DataGrid是类型名,taskDataGrid就是变量名。【参考方案2】:

你不想那样做。据推测,框和按钮添加了一个新任务。您想要做的是在 initDG 变量中添加一个新行。它应该是一个 ArrayCollection。然后,添加后,网格将刷新以显示新数据。

您不希望您的 UI 成为数据。您希望它反映数据。专注于修改数据模型并简单地让网格反映它。您可能需要更深入地研究 Flex。专注于了解有关 DataGrid、dataProvider 以及绑定如何与 ArrayCollections 一起工作的更多信息。

【讨论】:

【参考方案3】:

查看 Peter Ent 关于项目渲染器的文章。它提供了非常丰富的信息,并让您了解一些最佳实践。我多次提到这个,我发现他说的很多东西都非常有用......

http://www.adobe.com/devnet/flex/articles/itemrenderers_pt1.html

本文特别向您展示了如何使用 ListData 访问父组件 - 正确的方法:

http://www.adobe.com/devnet/flex/articles/itemrenderers_pt3_02.html

ListData 是访问父级的关键。另一种选择是从渲染器调度自定义事件。

【讨论】:

@Eric 您能否解释/链接到说明为什么不应使用 this.owner 的内容?

以上是关于如何访问另一个组件中一个 mxml 中的数据网格?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 adobe flex 中的 actionscript 变量访问 mxml 组件?

如何在 flex-edited 中从另一个 mxml 组件调用 mxml 组件

在 Flex 中,如何在 MXML 应用程序文件和 MXML 组件文件之间来回传递 var 对象

在 Flex 中的自定义组件之间传递值 - mxml [关闭]

AIR:基于窗口的 mxml 组件中的组件被冻结

Flex 组件和 main.mxml 通信