Filtering of Hierarchical Data i…

来源:互联网 发布:我的世界符文矩阵 编辑:程序博客网 时间:2024/05/17 02:27

Source: http://techrays.wordpress.com/2007/10/12/filtering-of-hierarchical-data-in-advanceddatagrid/

There is a TextInput control, in which the user can type somestring to filter. After the user click a button, the filterFunctionwill be changed to a new one, which actually does the filter.

<?xml version="1.0"encoding="utf-8"?>
<s:SkinnableContainerxmlns:fx="http://ns.adobe.com/mxml/2009"
                xmlns:s="library://ns.adobe.com/flex/spark"
                 xmlns:mx="library://ns.adobe.com/flex/mx"
                xmlns:components="com.demandtec.common.controls.*"
                xmlns:views="com.demandtec.openlink.producthierarchy.views.*"
                xmlns:comp="com.demandtec.openlink.producthierarchy.util.*"
                 width="100%" height="100%"
                 creationComplete="init()">
   
   <fx:Script><![CDATA[
       importcom.demandtec.openlink.common.IconConsts;
       importcom.demandtec.openlink.producthierarchy.model.ProductHierarchyTree;
       importcom.demandtec.openlink.producthierarchy.model.presentation.ProductHierarchyPresentationModel;
       importcom.demandtec.openlink.producthierarchy.util.CategoryNameErrorRenderer;
       importcom.demandtec.openlink.producthierarchy.util.ImageStatusRenderer;
      
       importmx.collections.ArrayCollection;
       importmx.collections.IHierarchicalCollectionView;
       importmx.managers.PopUpManager;
      
      [Bindable]
       private varitemRendererFactory:ClassFactory= null;
      
      [Bindable]
       private varimageItemRendererFactory:ClassFactory= null;
      
      [Autowire]
      [Bindable]
       public varmodel:ProductHierarchyPresentationModel;
      
       privatefunction init():void {
         itemRendererFactory = newClassFactory(CategoryNameErrorRenderer);
         imageItemRendererFactory = newClassFactory(ImageStatusRenderer);
         model.init(this);
       }
      

       protectedfunction showDialog():void
       {
         
          varmyPop:AddCategoryPopupDialog=AddCategoryPopupDialog(PopUpManager.createPopUp(this,AddCategoryPopupDialog, true));
         PopUpManager.centerPopUp(myPop);
       }
      
       privatefunction filter():void
       {
          // assignfilter function to the AdvancedDataGrid's dataProvider
         IHierarchicalCollectionView(dataGrid.dataProvider).filterFunction =filterFunction;
         
          // refreshthe ADG's dataProvider
         IHierarchicalCollectionView(dataGrid.dataProvider).refresh();
       }

       publicfunction filterFunction(node:Object):Boolean
       {
          varstr:String = searchString.text.toLowerCase();
          varallowed:Boolean = false;
         
          vartreeNode:ProductHierarchyTree = node as ProductHierarchyTree;
          varhasValidChildren:Boolean = false;
          varchildren:ArrayCollection = treeNode.children;
          for each(var child:ProductHierarchyTree in children){
            if(filterFunction(child)){
               hasValidChildren = true;
                break;
             }
          }
          // beginfiltering
         if(str=="")
          {
             allowed =true;
          }
          elseif(treeNode.nodeName.toLowerCase().indexOf(str) != -1)
          {
             allowed =true;
          }
          else {
             allowed =hasValidChildren;
          }
         
          returnallowed;
       }

      
   ]]></fx:Script>
   <s:layout>
      <s:VerticalLayout gap="0" />
   </s:layout>
   <mx:HDividedBox width="100%"styleName="toolBar">
      <s:SkinnableContainerstyleName="toolBarBreadcrumbAreaSkin"height="30">       
         <s:Label text="{OpenlinkI18N.openlink_title_product_hierarchy}"styleName="breadcrumbSelected" />
      </s:SkinnableContainer>
      
      <s:SkinnableContainer styleName="toolBarButtonAreaSkin">
         
         <components:IconButtonlabel="{DTCommonI18n.common_label_save}"id="btnSave"  icon="{IconConsts.saveIcon}"enabled="false" click="model.saveMappingHandler()"/>
         <components:IconButtonlabel="{OpenlinkI18N.openlink_btn_revert_last_save}"id="btnRevert"  icon="{IconConsts.displayIcon}"enabled="false" click="model.cancelMapping();"/>
         
         <mx:Spacer width="10"/>
         
         <components:IconButtonlabel="{OpenlinkI18N.openlink_btn_add_category}"id="btnAddCategory" icon="{IconConsts.toolbarIconNew}"click="showDialog();" />
         <s:TextInputid="searchString"/>
         <components:IconButton id="searchNode" label="Find"click="filter()"/>
         
      </s:SkinnableContainer>
   </mx:HDividedBox>
   <s:SkinnableContainerstyleName="gridBorderContainer" height="100%" width="100%">         
      
      <mx:AdvancedDataGrid id="dataGrid" width="100%"height="100%" editable="true" folderClosedIcon="{null}"folderOpenIcon="{null}">
         <mx:dataProvider>
            <mx:HierarchicalData id="hierarchydata"source="{model.PHTree}"childrenField="children"/>
         </mx:dataProvider>
         <mx:columns>
            <mx:AdvancedDataGridColumn dataField="nodeName"headerText="{OpenlinkI18N.openlink_headtext_product_hierarchy}"editable="false"/>
            <mx:AdvancedDataGridColumn dataField="nodeID"visible="false"/>
            <mx:AdvancedDataGridColumn id="edtCol"headerText="{OpenlinkI18N.openlink_label_dt_category}"editable="true" sortable="false" dataField="demandCatName"
                                itemRenderer="{itemRendererFactory}" >
               <mx:itemEditor>
                  <fx:Component>
                     <comp:AutoCompletedataProvider="{outerDocument.model.demandCategories}"labelField="categoryName"prompt="{data.IsInheritedNew?null:data.demandCatName}"/>
                  </fx:Component>
               </mx:itemEditor>
            </mx:AdvancedDataGridColumn>
            <mx:AdvancedDataGridColumndataField="updateExistingProducts" id="cbUpdate"headerText="{OpenlinkI18N.openlink_headtext_update_existing_products_on_save}"editable="false" >
               <mx:itemRenderer>
                  <fx:Component>
                     <comp:HidableCheckBox label=""selectedField="updateExistingProducts"change="data.updateExistingProducts = selected"
                               paddingLeft="10"forceHide="{!data.isDemandCatNameChanged}"enabled="{data.isUpdateCheckBoxEnabled}"
                               click="ProductHierarchyApp(mx.core.FlexGlobals.topLevelApplication).ProductHierarchyView.model.updateExistingProductsHandler();"/>
                  </fx:Component>
               </mx:itemRenderer>
            </mx:AdvancedDataGridColumn>
         </mx:columns>
         
      </mx:AdvancedDataGrid>
   </s:SkinnableContainer>   
   
   
   
</s:SkinnableContainer>

       privatefunction filter():void
       {
          // assignfilter function to the AdvancedDataGrid's dataProvider
         IHierarchicalCollectionView(dataGrid.dataProvider).filterFunction =filterFunction;
         
          // refreshthe ADG's dataProvider
         IHierarchicalCollectionView(dataGrid.dataProvider).refresh();
       }

       publicfunction filterFunction(node:Object):Boolean
       {
          varstr:String = searchString.text.toLowerCase();
          varallowed:Boolean = false;
         
          vartreeNode:ProductHierarchyTree = node as ProductHierarchyTree;
          varhasValidChildren:Boolean = false;
          varchildren:ArrayCollection = treeNode.children;
          for each(var child:ProductHierarchyTree in children){
            if(filterFunction(child)){
               hasValidChildren = true;
                break;
             }
          }
          // beginfiltering
         if(str=="")
          {
             allowed =true;
          }
          elseif(treeNode.nodeName.toLowerCase().indexOf(str) != -1)
          {
             allowed =true;
          }
          else {
             allowed =hasValidChildren;
          }
         
          returnallowed;
       }

<?xml version="1.0"encoding="utf-8"?>
<mx:WindowedApplicationxmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"height="500">

<mx:Script>
   <![CDATA[
      import mx.collections.ArrayCollection;
      import mx.collections.HierarchicalData;
      importmx.collections.IHierarchicalCollectionView;
      
      // dataProvider for the AdvancedDataGrid
      [Bindable]
      private var fs2:XML =  
         <item fileName="1" size="5563"lastModified="October 6, 2006">
            <item fileName="2" size="234"lastModified="November 7, 2003">
               <item fileName="3" size="2345"lastModified="December 8, 2006"/>
               <item fileName="4" size="3256"lastModified="November 9, 2005"/>
            </item>
            <item fileName="5" size="2345342"lastModified="October 10, 2007">
               <item fileName="6"size="523452563" lastModified="November 11,2006"/>
               <item fileName="17" size="124234"lastModified="December 12, 2006"/>
            </item>
            <item fileName="8" size="23452"lastModified="October 13, 2007">
               <item fileName="9" size="12345"lastModified="November 14, 2006"/>
               <item fileName="10" size="241"lastModified="December 15, 2004">
                  <item fileName="11" size="34563"lastModified="November 16, 2005"/>
                  <item fileName="12" size="3456345"lastModified="October 17, 2006"/>
               </item>   
            </item>
         </item>;
            
      private function filterIt():void
      {
         // assign filter function to theAdvancedDataGrid's dataProvider
         IHierarchicalCollectionView(adg.dataProvider).filterFunction= browseFilter;
                 
         // refresh the ADG's dataProvider
         IHierarchicalCollectionView(adg.dataProvider).refresh();
      }
      
       private function browseFilter(item:Object):Boolean {
            var xml:XML = XML(item);
    
            if(xml.children().length() >0){
               var hasValidChildren:Boolean = false;
               for each(var node:XML in xml.item){
                  if(browseFilter(node)){
                     hasValidChildren = true;
                     break;
                  }
               }
               if(String(xml["@fileName"].toString().toLowerCase()).indexOf(txt.text.toLowerCase())>= 0) {
                  return true;
               }
               else {
                  return hasValidChildren;
               }
            }
            else {
               returnString(xml["@fileName"].toString().toLowerCase()).indexOf(txt.text.toLowerCase())>= 0;
            }
              
      
   ]]>
</mx:Script>

   <mx:Label fontSize="16"htmlText="&lt;b&gt; Filtering ofHierarchical Data in AdvancedDataGrid&lt;/b&gt;" />
    
   <mx:AdvancedDataGrid id="adg"dataProvider="{new HierarchicalData(fs2)}"displayItemsExpanded="true"
      width="400" height="350" >
      <mx:columns>
         <mx:AdvancedDataGridColumndataField="@fileName" />
         <mx:AdvancedDataGridColumndataField="@size" />
         <mx:AdvancedDataGridColumndataField="@lastModified" />
      </mx:columns>
   </mx:AdvancedDataGrid>
    
   <mx:HBox>
      
      <mx:Label text="Enter text:"/>
      <mx:TextInput id="txt"change="filterIt();" />
    
   </mx:HBox>

</mx:WindowedApplication>

0 0
原创粉丝点击