Apache flex Flex DataGrid:基于另一个值更改值?
我在Flex中有一个DataGrid,一列是复选框,另一列是数值。单击复选框时,数值应更改,如果未选中复选框,则为0;如果选中复选框,则为预定义的最小值。以下是我的代码:Apache flex Flex DataGrid:基于另一个值更改值?,apache-flex,datagrid,Apache Flex,Datagrid,我在Flex中有一个DataGrid,一列是复选框,另一列是数值。单击复选框时,数值应更改,如果未选中复选框,则为0;如果选中复选框,则为预定义的最小值。以下是我的代码: <mx:DataGrid x="0" y="45" width="272" height="525" dataProvider="{dp}" variableRowHeight="true" editable="true" id="equipmentDG" verticalAlign="middle">
<mx:DataGrid x="0" y="45" width="272" height="525" dataProvider="{dp}" variableRowHeight="true" editable="true" id="equipmentDG" verticalAlign="middle">
<mx:columns>
<mx:DataGridColumn headerText="" headerStyleName="gridheader" width="20" dataField="included" editorDataField="selected" rendererIsEditor="true">
<mx:itemRenderer>
<fx:Component>
<mx:CheckBox click="handleClicks(event)">
<fx:Script>
<![CDATA[
public function handleClicks(event:MouseEvent):void
{
data.included = !data.included;
if(data.included && data.antal == 0)
data.antal = data.minNo;
else if(!data.included)
data.antal = 0;
}
]]>
</fx:Script>
</mx:CheckBox>
</fx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
<mx:DataGridColumn headerText="Antal" headerStyleName="gridheader" width="40" dataField="antal" editorDataField="value" editable="true">
<mx:itemEditor>
<fx:Component>
<mx:NumericStepper stepSize="1" width="35" height="20" focusOut="numericstepper1_changeHandler(event)">
<fx:Script>
<![CDATA[
import mx.events.NumericStepperEvent;
override public function set data(value:Object):void
{
super.data = value;
if (value && value.hasOwnProperty("minNo"))
minimum = value.minNo;
if (value && value.hasOwnProperty("maxNo"))
maximum = value.maxNo;
}
protected function numericstepper1_changeHandler(event:Event):void
{
if(data.antal > 0)
data.included = true;
else
data.included = false;
}
]]>
</fx:Script>
</mx:NumericStepper>
</fx:Component>
</mx:itemEditor>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>
0)
data.include=true;
其他的
data.include=false;
}
]]>
该值在数据中更新(当我关闭并打开该对话框时可以看到),但它不会在数据网格中立即更新。如何在单击复选框后立即使值发生明显的更改?下面是一种快速而肮脏的方法:重新分配
数据提供程序。这将强制DataGrid失效。在数据对象中,确保每次包含的属性更改时都触发事件。在第2个itemRenderer中,侦听事件并在属性更改时更新值
概念上是这样的:
<mx:DataGridColumn headerText="Antal" headerStyleName="gridheader" width="40" dataField="antal" editorDataField="value" editable="true">
<mx:itemRenderer>
<fx:Component>
<mx:Label dataChange="onDataChange()" >
<fx:Script>
<![CDATA[
public function onDataChange():void{
thistext = data['Antal'];
this.data.addEventListener('includedChanged',onIncludedChange);
}
public function onIncludedChange(e:Event):void{
this.text = data['Antal'];
}
]]>
</fx:Script>
</mx:Label>
</fx:Component>
</mx:itemRenderer>
<mx:itemEditor>
<fx:Component>
<mx:NumericStepper stepSize="1" width="35" height="20" focusOut="numericstepper1_changeHandler(event)">
<fx:Script>
<![CDATA[
import mx.events.NumericStepperEvent;
override public function set data(value:Object):void{
super.data = value;
if (value && value.hasOwnProperty("minNo"))
minimum = value.minNo;
if (value && value.hasOwnProperty("maxNo"))
maximum = value.maxNo;
}
protected function numericstepper1_changeHandler(event:Event):void
{
if(data.antal > 0)
data.included = true;
else
data.included = false;
}
]]>
</fx:Script>
</mx:NumericStepper>
</fx:Component>
</mx:itemEditor>
</mx:DataGridColumn>
在数据对象中:
private var _included : Boolean;
public function get included():Boolean{
return this._included;
}
public function set included(value:Boolean):void
this._included = value;
this.dispatchEvent(new Event('includedChanged');
}
将渲染器添加到第二列,如下所示:
<mx:DataGridColumn headerText="Antal" headerStyleName="gridheader" width="40" dataField="antal" editorDataField="value" editable="true">
<mx:itemRenderer>
<fx:Component>
<mx:Label dataChange="onDataChange()" >
<fx:Script>
<![CDATA[
public function onDataChange():void{
thistext = data['Antal'];
this.data.addEventListener('includedChanged',onIncludedChange);
}
public function onIncludedChange(e:Event):void{
this.text = data['Antal'];
}
]]>
</fx:Script>
</mx:Label>
</fx:Component>
</mx:itemRenderer>
<mx:itemEditor>
<fx:Component>
<mx:NumericStepper stepSize="1" width="35" height="20" focusOut="numericstepper1_changeHandler(event)">
<fx:Script>
<![CDATA[
import mx.events.NumericStepperEvent;
override public function set data(value:Object):void{
super.data = value;
if (value && value.hasOwnProperty("minNo"))
minimum = value.minNo;
if (value && value.hasOwnProperty("maxNo"))
maximum = value.maxNo;
}
protected function numericstepper1_changeHandler(event:Event):void
{
if(data.antal > 0)
data.included = true;
else
data.included = false;
}
]]>
</fx:Script>
</mx:NumericStepper>
</fx:Component>
</mx:itemEditor>
</mx:DataGridColumn>
0)
data.include=true;
其他的
data.include=false;
}
]]>
我会将antal标记为[Bindable],并将dp用作ArrayCollection。谢谢,但这不是我这次需要设置的最小值和最大值,而是实际值(data.antal)。它是在dataprovider中设置的,但在我为datagrid重置dataprovider之前不会显示在datagrid中。代码仍然是它应该如何工作的基本概念。因为您实际上并没有在代码中的任何地方显示“antal”值;我不确定您试图更新的是哪一个视觉片段“antal”值是datagrid第二列中显示的值。这是我单击复选框时没有明显更新的内容。代码已更新。从概念上讲,只需向第二列添加渲染器,并在触发更改事件时更新标签文本即可;这是一个非常高性能的解决方案。@Flextras,是的,这既快又脏。:-)谢谢,是的,它可以工作,而且我的数据提供者只能容纳不到20个项目,所以它感觉也很快。但最好是越少脏越好…至少在代码方面…;-)