DataGrid中自定义列问题

蓝色_冰点 2010-03-04 10:20:08
这是MXML代码
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo"
initialize="initApp(event)" xmlns:local="*">

<fx:Script>
<![CDATA[
import MyControl.SelectBox;

import mx.collections.ListCollectionView;
import mx.controls.Label;
import mx.events.FlexEvent;

private var data:XMLList=<>
<Row><ID>1</ID><Text>dsa</Text></Row>
<Row><ID>2</ID><Text>xvvvvvew</Text></Row>
<Row><ID>3</ID><Text>vabrytk</Text></Row>
<Row><ID>4</ID><Text>hd hhdhtr</Text><selected>true</selected></Row>
<Row><ID>5</ID><Text>cnvbcnte</Text></Row>
<Row><ID>6</ID><Text>eatbwq t ew</Text></Row>
</>;
protected function button1_clickHandler(event:MouseEvent):void
{
var lcv:ListCollectionView=this.dgList.dataProvider as ListCollectionView;
var cur:XML=this.dgList.selectedItem as XML;
cur.Text="aaaaa";
cur.ID="x"
cur.selected="true";
}

protected function initApp(event:FlexEvent):void
{
this.dgList.dataProvider=data;
}
]]>
</fx:Script>
<s:Button x="10" y="10" label="测试" click="button1_clickHandler(event)"/>
<mx:DataGrid id="dgList" x="10" y="39" width="557" height="185">
<mx:columns>
<mx:DataGridColumn headerText="选择"
itemRenderer="{new ClassFactory(MyControl.SelectBox)}" />
<mx:DataGridColumn headerText="ID" dataField="ID"/>
<mx:DataGridColumn headerText="Text" dataField="Text"
itemRenderer="{new ClassFactory(mx.controls.Label)}"/>
</mx:columns>
</mx:DataGrid>
</s:Application>

这是其中SelectBox的代码
package MyControl
{
import flash.events.Event;
import mx.controls.CheckBox;

public class SelectBox extends CheckBox
{
public function SelectBox()
{
super();
}

override public function initialize() : void{
super.initialize();
this.addEventListener(Event.CHANGE,OnChange);
}
private function OnChange(evn:Event):void{
super.data.selected=this.selected;
this.label=this.selected?"已选":"未选";
}

[Bindable]
override public function set data(value:Object):void
{
if(value==super.data) return;
super.data=value;
if(value==null) return;
this.Refresh();
}
override public function get data():Object
{
return super.data;
}
protected function Refresh():void
{
this.selected=(super.data.selected=="true");
this.label=this.selected?"已选":"未选";
}
}
}


运行效果就是,我在表格中选择某一行,然后点击“测试”按钮,更改了该行的数据
结果是第二、三列的显示内容都跟着马上变化,但是第一列的CheckBox的状态并没有跟着变化

问题是:为什么CheckBox不能响应数据的变化?同样是自定义的两列:第一列和第三列,为什么我自己写的SelectBox不可以跟据dataField的值来取得指定字段的值呢?而第三列就可以,怎么做到这点?
...全文
365 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuetao121 2010-03-05
  • 打赏
  • 举报
回复
你先好好的找找资料,看一下flex的渲染器的原理再说吧。
组件的加载,重载,都是怎么工作的。弄明白了你就知道了
xuetao121 2010-03-05
  • 打赏
  • 举报
回复
终于有空了,又仔细看了一下说的。你的想法是好的,我不否定。
但是你觉的那么做值得吗?
简单点来说,你为了实现,加了一个监听事件,这个flex很难移除的东西,你怎么处理?考虑过没有?
同时,无论你写进你的组件里,还在在外部直接刷新grid,获得的结果是不是一样?写进组件里,省事了,但是需要增加一些监听,调用一堆方法,生成一堆变量,flex的垃圾回收很烂的,你考虑到这些问题了吗?
还有你页面调用的button方法,传递了一个参数,你在方法里面没有使用,你为什么要这么定义方法,这个对象又变成了一个垃圾。
仔细想一想,做这些,所连带的成本,是否值得?做这些是否有用?是否是设计不合理?等等。别单一的去考虑问题。
syeia 2010-03-04
  • 打赏
  • 举报
回复
protected function button1_clickHandler(event:MouseEvent):void
{
var lcv:ListCollectionView=this.dgList.dataProvider as ListCollectionView;
var cur:XML=this.dgList.selectedItem as XML;
cur.Text="aaaaa";
cur.ID="x"
cur.selected="true";
SelectBox(dgList.indexToItemRenderer(dgList.selectedIndex)).Refresh();
}

折腾老半天,就这么简单.....
syeia 2010-03-04
  • 打赏
  • 举报
回复
我不说了.

像你那个as, 完全修改成mxml格式.

<VBox ...>
<mx:Checkbox id="chk" selected="{data.selected}" x="10" y="39" width="557" height="185">

</VBox>

你定义那个checkbox 有什么功能.

为什么不直接用checkbox?
把as 文件 修改成 mxml 文件
蓝色_冰点 2010-03-04
  • 打赏
  • 举报
回复
protected function button1_clickHandler(event:MouseEvent):void
{
var lcv:ListCollectionView=this.dgList.dataProvider as ListCollectionView;
var cur:XML=this.dgList.selectedItem as XML;
cur.Text="aaaaa";
cur.ID="x"
cur.selected="true";
}

在这段代码中,不难看出,当我点击按钮的时候,就可以给所选择的这行设置selected属性为true。对应于SelectBox的状态应该就是打钩的状态。

而我稍加修改,就可以实现点击按钮选择表格中的所有行,意思就是实现全选功能。
所以我要的功能就是SelectBox能自动响应数据的selected属性的变化。而现有的Label控件是能够自动响应与其对应的dataField属性值变化的,也就是说在cur.Text="aaaaa";这句代码,就可以使得Label的内容发生相应的变化,而SelectBox要怎么样才能达到这样的目的?
syeia 2010-03-04
  • 打赏
  • 举报
回复
你说的这个问题,自己试试把.

如果不继承这些想成的控件.
也就是说 itemRenderer 对应的是一个文件.

这个文件的控件,是可以用 data 绑定的.

像你那个as, 完全修改成mxml格式.

<VBox ...>
<mx:Checkbox id="chk" selected="{data.selected}" x="10" y="39" width="557" height="185">

</VBox>

不知道你为什么自定义, 很难操作.
蓝色_冰点 2010-03-04
  • 打赏
  • 举报
回复
问题是解决了,但总觉得不是最佳解决办法

像Label、TextInput之类的现有控件,如果拿它们做为itemRenderer的话,可以从DataGridColumn的dataField属性获得绑定数据的某一字段值,并且自动更新

而我自定义的SelectBox却不能从dataField取得指定属性,也不能自动更新

所以我想SelectBox控件能不能也做得像Label之类的控件一样,可以从dataField获取指定属性值,并自动更新。
xuetao121 2010-03-04
  • 打赏
  • 举报
回复
SelectBox(dgList.indexToItemRenderer(dgList.selectedIndex)).Refresh();
加这个就可以了,组件需要刷新啊。
水中影子 2010-03-04
  • 打赏
  • 举报
回复
看来,楼上已经帮解决了。
速度够快的

4,328

社区成员

发帖
与我相关
我的任务
社区描述
多媒体/设计 Flex
社区管理员
  • Flex
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧