2013-02-06 4 views
0

데이터 그리드에 다음과 같은 문제가 있습니다. 나는 클라이언트를 변경하는 comboBox를 가지고 클라이언트가 선택되면 시스템은 CheckBox와 두 개의 radioButton을 가진 ItemRenderer로 Datagrid를 채 웁니다. 처음으로 List를 채우면 모든 것이 잘 동작합니다.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는 데이터가 변경되지 않았기 때문에 디스플레이를 업데이트하지 않습니다.

즉, itemRenderers를 새로 고쳐야한다는 DataGrid에 알리는 코드를 작성할 수 있습니다. 당신은 다음과 같이하는 dataProvider를 대체하여 수행 할 수 있습니다 :

preciosGrid.dataProvider = myNewDataProvider; 

또는 컬렉션에 itemUpdated 방법을 사용하여

.
precioClienteModel.modelo.arrayColumnaProductos.itemUpdated(item); 

그래서 포스터는 자신의 dataProvider를 변화하고 있습니다. 문제는 그가 너무 구속력이있어 작업에 어려움이 있다는 것입니다. 하는 dataProvider는 다음과 같이 설정됩니다

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은 프리젠 테이션 모델이고 modelo는 arrayColletion 데이터가 데이터를 보유하는 모델 클래스입니다. 모두 Bindable 세트가 있습니다. 그래서, ArrayCollection이 변경된 후에는 그러한 모델이 Binding을 트리거하지 않는다고 말씀 하시겠습니까? 그렇기 때문에 이것을 관리하기 위해 로컬에 배치 된 중간 변수를 생성해야하는 이유는 무엇입니까? – Apalabrados