0

我对 Datagrid 有以下问题。我有一个可以更改客户端的组合框,一旦选择了客户端,系统就会使用具有 CheckBox 和两个单选按钮的 ItemRenderer 填充 Datagrid。我第一次填充列表时,一切正常。

当我更改客户端并触发事件以更改此类 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} );
                }
            }

}

数据网格是:

<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)"/>

谢谢。

4

1 回答 1

0

您只需将项目添加到网格的 dataProvider;您似乎从不删除旧物品。在这种情况下; 当前显示数据的 itemRenderer 不会更新它们的显示,因为它们的数据没有改变。

也就是说,您可以编写代码来告诉 DataGrid 必须刷新 itemRenderers。您可以通过替换 dataProvider 来做到这一点,如下所示:

preciosGrid.dataProvider = myNewDataProvider;

或通过在您的集合上使用itemUpdated方法。

precioClienteModel.modelo.arrayColumnaProductos.itemUpdated(item);

所以海报正在改变他的dataProvider。我怀疑问题在于他的级别太深而无法绑定工作。dataProvider 设置如下:

 dataProvider="{precioClienteModel.modelo.arrayColumnaProductos}"

因此,Binding 将寻找对 precioClienteModel 对象的 modelo 属性的更改;并且 modelo 没有改变,只是它的一个实例变量;因此不会触发绑定。一种解决方案可能是将实例存储到本地模型,并在组件设置期间设置它,可能在 precioClienteModel 的设置器中:

[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
}

然后我认为应该正确触发绑定。

于 2013-02-06T14:07:29.777 回答