2013-02-06 71 views
0

Datagrid我有以下問題。我有一個更改客戶端的組合框,一旦選擇了一個客戶端,系統就會用一個帶有CheckBox和兩個RadioButton的ItemRenderer填充Datagrid。我第一次填充列表,一切正常。ItemRenderers保存更改後數據提供列表中的狀態

問題出在我更改客戶端並觸發事件以更改此類Datagrid的內容時。 Datagrid dataProvider被重新聲明爲一個新的ArrayCollection並迭代填充新的信息。

問題是雖然內容已更改,但複選框的狀態與更改之前保持一致。

這裏發生了什麼?我不明白。

EDIT

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

謝謝。

+0

雅需要在這裏放一些代碼。沒有猜測'爲你。 – ethrbunny

回答

0

您只將項目添加到網格的dataProvider;你似乎永遠不會刪除舊的項目。在這種情況下;當前顯示數據的itemRenderer不會更新他們的顯示,因爲他們的數據沒有改變。

也就是說,您可以編寫代碼告訴DataGrid必須刷新itemRenderer。您可以通過更換數據提供程序,這樣做:

preciosGrid.dataProvider = myNewDataProvider; 

或使用itemUpdated方法在您的收藏。

precioClienteModel.modelo.arrayColumnaProductos.itemUpdated(item); 

所以海報正在改變他的數據提供程序。我懷疑這個問題是他有太多的工作水平。該數據提供程序設置是這樣的:

dataProvider="{precioClienteModel.modelo.arrayColumnaProductos}" 

那麼,綁定將神色一變到precioClienteModel對象的莫德洛財產;並且modelo沒有改變,只有它的一個實例變量;因此綁定不會被觸發。一種解決方案可能是保存一個實例在本地莫德洛和組件過程中的precioClienteModel二傳手setuppossibly設置:

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

話,我想結合應正確觸發。

+0

問題是preciosGrid.dataProvider指向「precioClienteModel.modelo.arrayColumnaProductos」,並且此arrayColletion重置如下:precioClienteModel.modelo.arrayColumnaProductos = new ArrayColletion; – Apalabrados

+0

你是對的;在審查時我錯過了那段代碼。我懷疑問題在於你的工作層次太深。我會更新答案以嘗試更深入地解釋。 – JeffryHouser

+0

嗨,我正在使用歐芹,所以這就是爲什麼你看到這個:precioClienteModel是Presentation Model,而modelo是arrayColletion數據保存數據的模型類。所有它都是Bindable集合。那麼,你告訴我,一旦ArrayCollection被改變,這樣的模型不會觸發綁定?這就是爲什麼我應該創建一個本地放置的中間變量來管理這個變量? – Apalabrados

相關問題