我在flex工作了几年,在我看来它是一个很棒的工具。几天前,我的数据网格中有一个外部行为。
我有一个php服务,它读取数据库并将此数据发送给felx。保存在flex中的dataprovider中的服务和信息没有问题,但是当datagrid显示加载的信息时,它会显示许多具有错误数据的单元格。显示的数据似乎与其他细胞混合。 例如我有两个寄存器:“灯泡是红色的”和“狗是危险的”。但数据网格显示例如“灯泡是危险的”或“狗是红色的”。
当我在断点中看到数据提供者时,所有数据都是正确的。
但是当我点击一个有问题的单元格时,这甚至很奇怪,这会自动将其内容更改为正确的值。
我没有找到可能的原因,而且我正在失去理智。我也试过像验证函数这样的解决方案,我关闭了数据网格和浏览器缓存并重新绘制了所有组件。但似乎没有任何效果。可能是一个Flash播放器问题?
非常感谢任何帮助。感谢。
一张照片(永远不同)
...代码
<?xml version="1.0" encoding="utf-8"?>
<fx:Script>
<![CDATA[
protected function btnBuscar_clickHandler(event:MouseEvent):void{//Calls the searching service
dfFechaOtrosDetalles.text = "";
if ((txtBuscarId.text == "") && (dfBuscarFecha.text == "") && (comboBuscarCiudades.textInput.text == "") && (txtBuscarEmpresa.text == "") && (txtBuscarSucursal.text == "") && (txtBuscarObra.text == "") && ((comboBuscarEstado.selectedItem == " ") || (comboBuscarEstado.selectedItem == "")))
txtBuscarId.setFocus();
else
if (comboBuscarCiudades.textInput.text == "")
getAllPropuestaResult.token = propuestaService.buscarPropuesta(txtBuscarId.text.toString(),dfBuscarFecha.text,RBGRangoBusquedaFecha.selectedValue.toString(),"",txtBuscarEmpresa.text,txtBuscarSucursal.text,txtBuscarObra.text,comboBuscarEstado.selectedItem);
else
getAllPropuestaResult.token = propuestaService.buscarPropuesta(txtBuscarId.text,dfBuscarFecha.text,RBGRangoBusquedaFecha.selectedValue.toString(),comboBuscarCiudades.selectedItem.id,txtBuscarEmpresa.text,txtBuscarSucursal.text,txtBuscarObra.text, comboBuscarEstado.selectedItem);
}
]]>
</fx:Script>
<fx:Declarations>
<s:CallResponder id="getAllPropuestaResult"/>
<propuestaservice:PropuestaService id="propuestaService" fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" showBusyCursor="true"/>
<PropuestasDataType:PropuestasDataType id="propuestasDataType"/>
<fx:Binding source="dgPropuestas.selectedItem as PropuestasDataType" destination="propuestasDataType"/>
<!-- MAIN INTERFACE-->
<mx:DataGrid x="17" y="40" id="dgPropuestas" dataProvider="{getAllPropuestaResult.lastResult}" styleName="grid" height="184" change="dgPropuestas_changeHadler(event)">
<mx:columns>
<mx:DataGridColumn headerText="ID" dataField="id" width="40"/>
<mx:DataGridColumn headerText="Ciudad" dataField="ciudydepto" width="150" itemRenderer="mxml.IRRichEditableDataGrid"/>
<mx:DataGridColumn headerText="Empresa" dataField="empresa" width="150" itemRenderer="mxml.IRRichEditableDataGrid"/>
<mx:DataGridColumn headerText="Sucursal" dataField="sucursal" width="130" itemRenderer="mxml.IRRichEditableDataGrid"/>
<mx:DataGridColumn headerText="Obra" dataField="obra" width="200" itemRenderer="mxml.IRRichEditableDataGrid"/>
<mx:DataGridColumn headerText="Valor" dataField="valor" width="100" itemRenderer="mxml.IRRichEditableDataGrid"/>
</mx:columns>
</mx:DataGrid>
我仍然有问题,但现在我意识到这是与itemrenderers相关的问题。我有一个IR,允许从单元格中选择和复制文本,但我已经测试过,如果没有IR相关,则不会出现此错误。这是IR的代码。
<s:MXDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
focusEnabled="true">
<s:RichEditableText id="lblData" top="0" left="2" right="0" bottom="0" text="{dataGridListData.label}" selectable="true" editable="false" height="35" verticalAlign="middle"/>
答案 0 :(得分:0)
我在过去注意到,有时,dataGrid itemRenderer可能无法将正确的值保存在正确的位置,尤其是当您拥有大量数据时。
问题是因为当您调整应用程序大小或向下滚动dataGrid时,会触发dataChange()事件,看起来itemRenderer无法正确绑定数据。
这个解决方案对我有用:
<?xml version="1.0" encoding="utf-8"?>
<s:MXDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
focusEnabled="true" dataChange="dataChangeHandler(event)">
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
import mx.utils.ObjectProxy;
[Bindable]
private var _data:ObjectProxy;
protected function dataChangeHandler(event:FlexEvent):void
{
if (data)
_data = new ObjectProxy(data);
}
]]>
</fx:Script>
<s:RichEditableText id="lblData" top="0" left="2" right="0" bottom="0" text="{_data.label}" selectable="true" editable="false" height="35" verticalAlign="middle"/>
</s:MXDataGridItemRenderer>
尝试并告诉我们: - )