2008-09-21 12 views
0

나는 AdvancedDataGrid 위젯을 사용하고 있으며 두 열을 라디오 버튼으로 지정합니다. 각 열은 자체 RadioButtonGroup입니다. 필요한 모든 mxxml을 가지고 있다고 생각했지만 이상한 동작 문제가 발생했습니다. 위아래로 스크롤하면 버튼이 값을 변경합니다! 선택된 버튼은 선택 해제되고 선택되지 않은 버튼은 선택됩니다. 누구든지이 버그에 대한 단서가 있습니까? 이 일을 다른 방식으로해야할까요? - 여기에 내가하려는 일의 껍질을 벗긴 예가있다.Adobe Flex에서 RadioButton의 열 만들기

<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:RadioButtonGroup id="leftAxisGrp" /> 
    <mx:RadioButtonGroup id="rightAxisGrp"> 
    <mx:change> 
     <![CDATA[ 
     trace (rightAxisGrp.selection); 
     trace (rightAxisGrp.selection.data.name); 
     ]]> 
    </mx:change> 
    </mx:RadioButtonGroup> 
    <mx:AdvancedDataGrid 
     id="readingsGrid" 
     designViewDataType="flat" 
     height="150" width="400" 
     sortExpertMode="true" 
     selectable="false"> 
    <mx:columns> 
     <mx:AdvancedDataGridColumn 
      headerText="L" width="25" paddingLeft="6" 
      dataField="left" sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="leftAxisGrp" /> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn 
      headerText="R" width="25" paddingLeft="6" 
      dataField="right" sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="rightAxisGrp" /> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn headerText="" dataField="name" /> 
    </mx:columns> 
    <mx:dataProvider> 
     <mx:Array> 
     <mx:Object left="false" right="false" name="Reddish-gray Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Golden-brown Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Northern Rufous Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Sambirano Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Simmons' Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Pygmy Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Brown Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Madame Berthe's Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Goodman's Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Jolly's Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Mittermeier's Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Claire's Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Danfoss' Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Lokobe Mouse Lemur" /> 
     <mx:Object left="true" right="true" name="Bongolava Mouse Lemur" /> 
     </mx:Array> 
    </mx:dataProvider> 
    </mx:AdvancedDataGrid> 
</mx:WindowedApplication> 

업데이트] (감사 청구서!)

좋아! 가라. 나는 단지 법안의 제안에서 몇 가지 변경을해야했습니다. 주로 ObjectProxy와 함께 ArrayCollection을 사용하므로 바인딩 가능하고 동적이었습니다. 하나의 이상한 일 - 나는 배열에서 배열 시간을 채우면 첫 번째 행의 버튼을 선택할 수 없습니다. creationComplete 이벤트가 발생할 때까지 지연해야했습니다 (어쨌든 db에서 그리드를 채울 예정이므로 괜찮습니다).

<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:Script> 
    <![CDATA[ 
     import mx.utils.ObjectProxy; 
     import mx.collections.ArrayCollection; 

     [Bindable] 
     private var myData:ArrayCollection = new ArrayCollection(); 

     private function selectItem (selObject:Object, property:String) : void 
     { 
     for each (var obj:ObjectProxy in myData) { 
      obj[property] = (obj.name === selObject.name); 
     } 
     readingsGrid.invalidateDisplayList(); 
     } 
    ]]> 
    </mx:Script> 
    <mx:RadioButtonGroup id="leftAxisGrp"> 
    <mx:change> 
     <![CDATA[ 
     selectItem (leftAxisGrp.selectedValue, 'left'); 
     ]]> 
    </mx:change> 
    </mx:RadioButtonGroup> 
    <mx:RadioButtonGroup id="rightAxisGrp"> 
    <mx:change> 
     <![CDATA[ 
     selectItem (rightAxisGrp.selectedValue, 'right'); 
     ]]> 
    </mx:change> 
    </mx:RadioButtonGroup> 
    <mx:AdvancedDataGrid 
     id="readingsGrid" 
     designViewDataType="flat" 
     dataProvider="{myData}" 
     sortExpertMode="true" 
     height="150" width="400" 
     selectable="false"> 
    <mx:columns> 
     <mx:AdvancedDataGridColumn id="leftCol" 
      headerText="L" width="25" paddingLeft="6" sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="leftAxisGrp" 
       buttonMode="true" value="{data}" selected="{data.left}" /> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn id="rightCol" 
      headerText="R" width="25" paddingLeft="6" sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="rightAxisGrp" 
       buttonMode="true" value="{data}" selected="{data.right}" /> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn headerText="" dataField="name" /> 
    </mx:columns> 
    <mx:creationComplete> 
     <![CDATA[ 
     myData.addItem(new ObjectProxy ({ left:true, right:true, name:"Golden-brown Mouse Lemur" })); 
     myData.addItem(new ObjectProxy ({ left:false, right:false, name:"Reddish-gray Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Northern Rufous Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Sambirano Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Simmons' Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Pygmy Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Brown Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Madame Berthe's Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Goodman's Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Jolly's Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Mittermeier's Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Claire's Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Danfoss' Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Lokobe Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Bongolava Mouse Lemur" }));    
     ]]> 
    </mx:creationComplete> 
    </mx:AdvancedDataGrid> 
</mx:WindowedApplication> 

답변

1

여기서 일어나는 일은 열의 itemRenderer 인스턴스 만 생성한다는 것입니다. 주위를 스크롤하면 해당 인스턴스가 재활용됩니다. 따라서 아래로 스크롤하면 첫 번째 행의 첫 번째 열을 그리던 RadioButton 객체가 변경되어 이제 일곱 번째 행의 첫 번째 열을 그릴 수 있습니다. 이 때마다 itemRenderer의 "data"속성이 재설정됩니다.

15 행의 데이터가있는 반면 30 개의 라디오 버튼이 아닌 12 개의 라디오 버튼이 있습니다 (6 개의 "행"에 대해 6 개, "보이는"행에 대해서는 6 개). 을 선택하면이 표시되지만 큰 문제는 아니지만 업데이트를 허용하면 문제가됩니다.

표시 문제를 해결하려면 열에 "dataField"를 설정하는 대신 RadioButton의 "selected"속성을 itemRenderer의 data.left (또는 right) 값에 바인딩 할 수 있습니다. 그런 다음 dataProvider의 항목을 "바인드 가능"으로 만들어야합니다.

업데이트 문제를 해결하려면 dataProvider 항목 값에 직접 바인딩해야하므로 업데이트해야합니다. 하나의 항목 당 하나의 RadioButton이 없으므로, 다른 구성표가 필요합니다. 이 경우에는 "true"로 설정된 "selected"를 제외하고 "false"로 각 항목의 left/right 속성을 설정하는 처리기를 넣습니다.

이러한 생각을 바탕으로 예제 코드를 업데이트했습니다. 다음과 같이 시도하십시오.

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application layout="absolute" 
    xmlns:my="*" 
    xmlns:mx="http://www.adobe.com/2006/mxml"> 
    <mx:RadioButtonGroup id="leftAxisGrp" 
     change="selectItem(leftAxisGrp.selectedValue, 'left');"/> 
    <mx:RadioButtonGroup id="rightAxisGrp" 
     change="selectItem(rightAxisGrp.selectedValue, 'right');"> 
    </mx:RadioButtonGroup> 
    <mx:AdvancedDataGrid 
     id="readingsGrid" 
     designViewDataType="flat" 
     height="150" width="400" 
     sortExpertMode="true" 
     selectable="false" 
     dataProvider="{adgData.object}"> 
    <mx:columns> 
     <mx:AdvancedDataGridColumn 
      headerText="L" width="25" paddingLeft="6" 
      sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="leftAxisGrp" 
       value="{data}" selected="{data.left}"/> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn 
      headerText="R" width="25" paddingLeft="6" 
      sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="rightAxisGrp" 
       value="{data}" selected="{data.right}"/> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn headerText="" dataField="name" /> 
    </mx:columns> 
    </mx:AdvancedDataGrid> 
    <mx:Model id="adgData"> 
     <root> 
     <object left="false" right="false" name="Reddish-gray Mouse Lemur" /> 
     <object left="false" right="false" name="Golden-brown Mouse Lemur" /> 
     <object left="false" right="false" name="Northern Rufous Mouse Lemur" /> 
     <object left="false" right="false" name="Sambirano Mouse Lemur" /> 
     <object left="false" right="false" name="Simmons' Mouse Lemur" /> 
     <object left="false" right="false" name="Pygmy Mouse Lemur" /> 
     <object left="false" right="false" name="Brown Mouse Lemur" /> 
     <object left="false" right="false" name="Madame Berthe's Mouse Lemur" /> 
     <object left="false" right="false" name="Goodman's Mouse Lemur" /> 
     <object left="false" right="false" name="Jolly's Mouse Lemur" /> 
     <object left="false" right="false" name="Mittermeier's Mouse Lemur" /> 
     <object left="false" right="false" name="Claire's Mouse Lemur" /> 
     <object left="false" right="false" name="Danfoss' Mouse Lemur" /> 
     <object left="false" right="false" name="Lokobe Mouse Lemur" /> 
     <object left="true" right="true" name="Bongolava Mouse Lemur" /> 
     </root> 
    </mx:Model> 
    <mx:Script> 
    <![CDATA[ 
     private function selectItem(selObject:Object, property:String) : void { 
      for each(var obj:Object in adgData.object) { 
       obj[property] = (obj === selObject); 
      } 
      readingsGrid.invalidateDisplayList(); 
     } 
    ]]> 
    </mx:Script> 
</mx:Application> 
0

재생산 된 제품입니다. 아마도 ADG 버그 일 가능성이 높습니다. (bugs.adobe.com에서이 파일을 찾지 못했지만 검색 결과가 좋지 않습니다.)

플렉스 3.0.3 또는 야간 빌드 here을 시도해 볼 수 있습니다 (경고가 꽤 깨져있을 수 있음). 수정했는지 확인하거나 맞춤 렌더러를 구현해 볼 수는 있지만 힘들 것입니다. 권리 취득.

관련 문제