我对Datagrid有以下问题。我有一个更改客户端的comboBox,一旦选择了客户端,系统就会使用一个具有CheckBox和两个radioButtons的ItemRenderer填充Datagrid。我第一次填充List时,一切正常。
当我更改客户端并触发事件以更改此类Datagrid的内容时,问题就出现了。 Datagrid dataProvider被重新声明为新的ArrayCollection并迭代填充新信息。
问题是复选框的状态保持不变,尽管内容已更改。
这里发生了什么?我无法理解。
编辑:
private function showProductosTable(evt:ResultEvent, token:Object):void {
precioClienteModel.modelo.arrayPanelPrecioCliente = new ArrayCollection;
for each(var data:Object in evt.result as ArrayCollection) {
var pc:PanelPrecioClienteDatatype = new PanelPrecioClienteDatatype;
pc.ID = data.ID;
pc.clienteID = data.clienteID;
pc.productoID = data.productoID;
pc.producto = data.producto;
pc.proveedorID = data.proveedorID;
pc.proveedor = data.proveedor;
pc.productos_proveedorID = data.productos_proveedorID;
pc.cantidad_80 = data.cantidad_80;
pc.cantidad_100 = data.cantidad_100;
pc.kg_caja_80 = data.kg_caja_80;
pc.kg_caja_100 = data.kg_caja_100;
precioClienteModel.modelo.arrayPanelPrecioCliente.addItem(pc);
// Comprobamos si ya tenemos metido el ProductoID en nuestra Columna de Productos
if ( !precioClienteModel.checkIfProductIDInList( pc.productoID ) ) {
precioClienteModel.modelo.arrayColumnaProductos.addItem( {'productoID':pc.productoID, 'producto':pc.producto,
'proveedor1': {'value':0, 'selected':false},
'proveedor2': {'value':0, 'selected':false},
'proveedor3': {'value':0, 'selected':false},
'proveedor4': {'value':0, 'selected':false},
'proveedor5': {'value':0, 'selected':false},
'proveedor6': {'value':0, 'selected':false},
'proveedor7': {'value':0, 'selected':false},
'proveedor8': {'value':0, 'selected':false},
'proveedor9': {'value':0, 'selected':false},
'proveedor10': {'value':0, 'selected':false},
'proveedor11': {'value':0, 'selected':false},
'proveedor12': {'value':0, 'selected':false},
'proveedor13': {'value':0, 'selected':false},
'proveedor14': {'value':0, 'selected':false},
'proveedor15': {'value':0, 'selected':false}} );
}
if ( !precioClienteModel.checkIfProveedorIDInList( pc.proveedorID ) ) {
precioClienteModel.modelo.arrayFilaProveedores.addItem( {'proveedorID':pc.proveedorID, 'proveedor':pc.proveedor} );
}
}
}
并且Datagrid是:
<s:DataGrid id="preciosGrid" top="65" width="935" height="379" horizontalCenter="0" requestedRowCount="4"
dataProvider="{precioClienteModel.modelo.arrayColumnaProductos}">
<s:columns>
<s:ArrayList>
<s:GridColumn dataField="producto" headerText="Producto" width="150" editable="false"></s:GridColumn>
<s:GridColumn dataField="proveedor1" headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
<s:GridColumn dataField="proveedor2" headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
<s:GridColumn dataField="proveedor3" headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
<s:GridColumn dataField="proveedor4" headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
<s:GridColumn dataField="proveedor5" headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
<s:GridColumn dataField="proveedor6" headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
<s:GridColumn dataField="proveedor7" headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
<s:GridColumn dataField="proveedor8" headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
<s:GridColumn dataField="proveedor9" headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
<s:GridColumn dataField="proveedor10" headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
<s:GridColumn dataField="proveedor11" headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
<s:GridColumn dataField="proveedor12" headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
<s:GridColumn dataField="proveedor13" headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
<s:GridColumn dataField="proveedor14" headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
<s:GridColumn dataField="proveedor15" headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
</s:ArrayList>
</s:columns>
</s:DataGrid>
和ItemRenderer:
<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Script>
<![CDATA[
import mx.controls.dataGridClasses.DataGridListData;
import mx.controls.listClasses.BaseListData;
import spark.components.DataGrid;
private var _listData:BaseListData;
[Bindable]private var isSelected:Boolean = false;
override public function prepare(hasBeenRecycled:Boolean):void {
}
protected function lblData_doubleClickHandler(event:MouseEvent):void {
isSelected = !isSelected;
data[column.dataField]['selected'] = isSelected;
}
override public function set data( value:Object ) : void {
super.data = value;
if (value != null)
lblData.text = data[column.dataField]['value'];
}
[Bindable]public function get listData() : BaseListData {
return _listData;
}
public function set listData( value:BaseListData ) : void {
_listData = value;
}
]]>
</fx:Script>
<s:Rect width="100%" height="100%">
<s:fill>
<s:SolidColor color="{isSelected?0xCDCDCD:0xFFFFFF}"/>
</s:fill>
</s:Rect>
<s:Label id="lblData" width="100%" height="100%"
textAlign="center" verticalAlign="middle"
doubleClickEnabled="true" doubleClick="lblData_doubleClickHandler(event)"/>
感谢。
答案 0 :(得分:0)
您只需将项添加到网格的dataProvider中;你似乎永远不会删除旧物品。在这种情况下;当前显示数据的itemRenderers不会更新其显示,因为它们的数据没有更改。
也就是说,您可以编写代码来告诉DataGrid必须刷新itemRenderer。您可以通过替换dataProvider来完成此操作,如下所示:
preciosGrid.dataProvider = myNewDataProvider;
或在您的收藏集上使用itemUpdated方法。
precioClienteModel.modelo.arrayColumnaProductos.itemUpdated(item);
所以海报正在改变他的dataProvider。我怀疑问题在于他有太多的层次来结合工作。 dataProvider设置如下:
dataProvider="{precioClienteModel.modelo.arrayColumnaProductos}"
因此,Binding将寻找对precioClienteModel对象的modelo属性的更改;和modelo不变,只是它的实例变量;因此不会触发绑定。一种解决方案可能是将一个实例存储到本地模式,并在组件集合期间将其设置为一个用于precioClienteModel的setter:
[Bindable]
protected var modelo : ModeloType;
private var _precioClientModel : PrecioClienteModelType;
public function get precioClientModel(value:PrecioClienteModelType):void{
return _precioClientModel;
}
public function set precioClientModel(value:PrecioClienteModelType):void{
modelo = precioClienteModel.modelo
}
然后我认为应该正确触发绑定。