对于一个DataGrid的DataGridColumn ItemRenderer,如何在操作Item
2009-02-18 22:29
295 查看
对于一个DataGrid的DataGridColumn ItemRenderer,如何在操作ItemRenderer后获取当前Column的Index值,比如假设这个ItemRenderer是一个Button,点一下要知道Index该咋办捏
上次我做的一个上传FileReferenceList Upload Files Sample处理过之类的问题,现在单独提取出来,其实就是利用ItemRenderer的data,之后在DataGrid的dataprovider中查找下
入口DataGridItemRenderer.mxml
Flex代码
<?xml version="1.0" encoding="utf-8"?>
<!-- -->
<!-- @author:magicianzrh -->
<!-- @weblog:http://www.actionscript3.cn/magicianzrh -->
<!-- @ignore:a sample show how to get itemrendeer index in DataGrid in flex -->
<!-- -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.collections.ArrayCollection;
private var demoData:Array = [ {"btnName":"name0","info":"info0"},
{"btnName":"name1","info":"info1"}];
[Bindable]
private var dataAry:ArrayCollection = new ArrayCollection(demoData);
public function pushNewData(itemIndex:int):void {
if (itemIndex == 1){
Alert.show("itemIndex==1,add new data","tips");
var newData:Object = {"btnName":"name2","info":"info2"};
dataAry.addItem(newData);
}
}
]]>
</mx:Script>
<mx:DataGrid x="0" y="0" dataProvider="{dataAry}">
<mx:columns>
<mx:DataGridColumn headerText="信息(info)" dataField="info"/>
<mx:DataGridColumn headerText="按钮(btn)" itemRenderer="org.magicianzrhLib.MyItemRenderer"/>
</mx:columns>
</mx:DataGrid>
</mx:Application>
org.magicianzrhLib下的MyItemRenderer.mxml
Flex代码
<?xml version="1.0" encoding="utf-8"?>
<!-- -->
<!-- @author:magicianzrh -->
<!-- @weblog:http://www.actionscript3.cn/magicianzrh -->
<!-- @ignore:a sample show how to get itemrendeer index in DataGrid in flex -->
<!-- -->
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="94" height="22">
<mx:Script>
<![CDATA[
import mx.core.Application;
import mx.controls.Alert;
import mx.collections.ArrayCollection;
import mx.controls.DataGrid;
private function clickHandler():void {
var itemIndex:int = ArrayCollection((owner as DataGrid).dataProvider).getItemIndex(data);
Alert.show(String(itemIndex),"itemIndex");
}
]]>
</mx:Script>
<mx:Button id="btn" x="{(this.width-btn.width)/2}" y="0" label="{data.btnName}" click="clickHandler();"/>
</mx:Canvas>
希望通过点击DataGrid中的Button可以获取相应Button所在行的index,DataGrid的 本身自带了蛮多的事件,对于这个问题有相关的事件是对鼠标事件的侦听,获取鼠标焦点看似不错的方法,不过你可以尝试下,对于这个问题,这种办法并不好
对于一个Flex Component,有两个属性可能大家平时会忽略掉,一个是owner指向当前Flex Component的容器,一个是data,就是对Flex Component的设值,这里就利用这两个来获取相应的index
在MyItemRenderer的clickHandler()处理中,我们首先要获取到DataGrid的dataProvider,从
DataGridItemRenderer中我们可以看到,DataGrid的dataProvider是一个ArrayCollection,当然上面
已经清晰的定义了整个ArrayCollection的结构
MyItemRenderer的data指向就ArrayCollection[i](i为当前行index)
var itemIndex:int = ArrayCollection((owner as DataGrid).dataProvider).getItemIndex(data);
我在DataGridItemRenderer中写了一个public function pushNewData(itemIndex:int):void {},如果作为一种逻辑:我需要点击一个特定的行中的按钮让DataGrid数据改变,应该怎么去做。
最简便的办法就是:
((owner as DataGrid).owner as DataGridItemRenderer).pushNewData(itemIndex);
或者(Application.application as DataGridItemRenderer).pushNewData(itemIndex);
第一个你必须把握好DataGridItemRenderer的结构;第二个就是Application的特殊点,必须是程序入口类
我们可以用一个字典来把相应的类引用跟相应的字符存储起来,通过dictionary[identifyString] 来获取类引用来调用
而如果是Cairngorm框架,那我们就不能这么写了,按Cairngorm设计,数据操作应该在Command中,如果需要跟后台交互,那
Command需要调用一个Delegate来完成跟后台的交互,Delegate完成出错处理以及相应的后台数据格式转化,之后回调Command修改
ModelLocator中的数据,通过绑定来达到使前台显示相应改变的效果
因为最新版本的Cairngorm以及把ViewLocator和ViewHelper取消掉了,不过有时候还是需要的,我还是保留着这方面的
上次我做的一个上传FileReferenceList Upload Files Sample处理过之类的问题,现在单独提取出来,其实就是利用ItemRenderer的data,之后在DataGrid的dataprovider中查找下
入口DataGridItemRenderer.mxml
Flex代码
<?xml version="1.0" encoding="utf-8"?>
<!-- -->
<!-- @author:magicianzrh -->
<!-- @weblog:http://www.actionscript3.cn/magicianzrh -->
<!-- @ignore:a sample show how to get itemrendeer index in DataGrid in flex -->
<!-- -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.collections.ArrayCollection;
private var demoData:Array = [ {"btnName":"name0","info":"info0"},
{"btnName":"name1","info":"info1"}];
[Bindable]
private var dataAry:ArrayCollection = new ArrayCollection(demoData);
public function pushNewData(itemIndex:int):void {
if (itemIndex == 1){
Alert.show("itemIndex==1,add new data","tips");
var newData:Object = {"btnName":"name2","info":"info2"};
dataAry.addItem(newData);
}
}
]]>
</mx:Script>
<mx:DataGrid x="0" y="0" dataProvider="{dataAry}">
<mx:columns>
<mx:DataGridColumn headerText="信息(info)" dataField="info"/>
<mx:DataGridColumn headerText="按钮(btn)" itemRenderer="org.magicianzrhLib.MyItemRenderer"/>
</mx:columns>
</mx:DataGrid>
</mx:Application>
<?xml version="1.0" encoding="utf-8"?> <!-- --> <!-- @author:magicianzrh --> <!-- @weblog:http://www.actionscript3.cn/magicianzrh --> <!-- @ignore:a sample show how to get itemrendeer index in DataGrid in flex --> <!-- --> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ import mx.controls.Alert; import mx.collections.ArrayCollection; private var demoData:Array = [ {"btnName":"name0","info":"info0"}, {"btnName":"name1","info":"info1"}]; [Bindable] private var dataAry:ArrayCollection = new ArrayCollection(demoData); public function pushNewData(itemIndex:int):void { if (itemIndex == 1){ Alert.show("itemIndex==1,add new data","tips"); var newData:Object = {"btnName":"name2","info":"info2"}; dataAry.addItem(newData); } } ]]> </mx:Script> <mx:DataGrid x="0" y="0" dataProvider="{dataAry}"> <mx:columns> <mx:DataGridColumn headerText="信息(info)" dataField="info"/> <mx:DataGridColumn headerText="按钮(btn)" itemRenderer="org.magicianzrhLib.MyItemRenderer"/> </mx:columns> </mx:DataGrid> </mx:Application>
org.magicianzrhLib下的MyItemRenderer.mxml
Flex代码
<?xml version="1.0" encoding="utf-8"?>
<!-- -->
<!-- @author:magicianzrh -->
<!-- @weblog:http://www.actionscript3.cn/magicianzrh -->
<!-- @ignore:a sample show how to get itemrendeer index in DataGrid in flex -->
<!-- -->
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="94" height="22">
<mx:Script>
<![CDATA[
import mx.core.Application;
import mx.controls.Alert;
import mx.collections.ArrayCollection;
import mx.controls.DataGrid;
private function clickHandler():void {
var itemIndex:int = ArrayCollection((owner as DataGrid).dataProvider).getItemIndex(data);
Alert.show(String(itemIndex),"itemIndex");
}
]]>
</mx:Script>
<mx:Button id="btn" x="{(this.width-btn.width)/2}" y="0" label="{data.btnName}" click="clickHandler();"/>
</mx:Canvas>
<?xml version="1.0" encoding="utf-8"?> <!-- --> <!-- @author:magicianzrh --> <!-- @weblog:http://www.actionscript3.cn/magicianzrh --> <!-- @ignore:a sample show how to get itemrendeer index in DataGrid in flex --> <!-- --> <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="94" height="22"> <mx:Script> <![CDATA[ import mx.core.Application; import mx.controls.Alert; import mx.collections.ArrayCollection; import mx.controls.DataGrid; private function clickHandler():void { var itemIndex:int = ArrayCollection((owner as DataGrid).dataProvider).getItemIndex(data); Alert.show(String(itemIndex),"itemIndex"); } ]]> </mx:Script> <mx:Button id="btn" x="{(this.width-btn.width)/2}" y="0" label="{data.btnName}" click="clickHandler();"/> </mx:Canvas>
希望通过点击DataGrid中的Button可以获取相应Button所在行的index,DataGrid的 本身自带了蛮多的事件,对于这个问题有相关的事件是对鼠标事件的侦听,获取鼠标焦点看似不错的方法,不过你可以尝试下,对于这个问题,这种办法并不好
对于一个Flex Component,有两个属性可能大家平时会忽略掉,一个是owner指向当前Flex Component的容器,一个是data,就是对Flex Component的设值,这里就利用这两个来获取相应的index
在MyItemRenderer的clickHandler()处理中,我们首先要获取到DataGrid的dataProvider,从
DataGridItemRenderer中我们可以看到,DataGrid的dataProvider是一个ArrayCollection,当然上面
已经清晰的定义了整个ArrayCollection的结构
MyItemRenderer的data指向就ArrayCollection[i](i为当前行index)
var itemIndex:int = ArrayCollection((owner as DataGrid).dataProvider).getItemIndex(data);
我在DataGridItemRenderer中写了一个public function pushNewData(itemIndex:int):void {},如果作为一种逻辑:我需要点击一个特定的行中的按钮让DataGrid数据改变,应该怎么去做。
最简便的办法就是:
((owner as DataGrid).owner as DataGridItemRenderer).pushNewData(itemIndex);
或者(Application.application as DataGridItemRenderer).pushNewData(itemIndex);
第一个你必须把握好DataGridItemRenderer的结构;第二个就是Application的特殊点,必须是程序入口类
我们可以用一个字典来把相应的类引用跟相应的字符存储起来,通过dictionary[identifyString] 来获取类引用来调用
而如果是Cairngorm框架,那我们就不能这么写了,按Cairngorm设计,数据操作应该在Command中,如果需要跟后台交互,那
Command需要调用一个Delegate来完成跟后台的交互,Delegate完成出错处理以及相应的后台数据格式转化,之后回调Command修改
ModelLocator中的数据,通过绑定来达到使前台显示相应改变的效果
因为最新版本的Cairngorm以及把ViewLocator和ViewHelper取消掉了,不过有时候还是需要的,我还是保留着这方面的
相关文章推荐
- flex datagrid column itemRenderer
- 对于如何去做一个系统的理解
- 如何在freescale banked区域操作一个变量(RAM, EEPROM, FLASH)
- 如何使用Loader来动态载入一个基于item的Component
- javascript操作两个选择列表(有两个列表,如何实现在一个列表通过双击和多选列表中内容添加到另一个列表. )
- Hibernate中对于数据的(增删改查)操作的一个例子的代码
- DataGridTemplateColumn 如何获取内部控件
- Oracle对于多个大表关联操作如何优化速度?
- 关于如何实现双击某一个tabBarItem,自动进行下拉刷新的问题。
- DataGrid 的 ItemDataBound 中如何获取匿名类型数据源的Item
- 如何解决ADO.NET访问Access数据库出现"操作必须使用一个可更新的查询"的问题
- 假设有一个rand(0,1)的0,1随机生成器,如何对于给定的(a,b),随机生成一个x, 其中 a <= x <= b
- 如何获得一个Execute操作影响行数。
- 网易面试之对于一个整数X,定义操作rev(X)为将X按数位翻转过来,并且去除掉前导0
- 在FTE的project里面,如何在一个没有Toolbar的screen添加Toolbar来实现快捷操作
- 讨论一个问题:对于复杂的业务流程Sharepoint如何实现?
- 对于一个具有几百万粉丝的用户,数据如何实时投递到所有用户? -- 德问精彩回答
- WPF DataGrid DataGridTemplateColumn 列头checkbox如何在代码中取消选择
- SilverLight学习笔记--如何在xaml文件中操作用户在后台代码定义的类(2)--示例篇:创建一个登录控件(原创)(转载本文请注明出处)
- 位操作:如何将一个变量其中一位清0,置1,取反