分享

DataGrid 过滤的例子

 smoking_boy 2007-06-11
用Flex开发的时候经常会用到DataGrid这个组件,这里有一个过滤DataGrid的例子,应该对初学者有所帮助。这个是从CFLEX那里看到的,仔细看了之后发现是个中国开发者写的,http://www./ 大家可以去看看,是个不错的社区,里面资讯教程都挺好。

点击这里查看示例

下面是代码

程序代码 程序代码

<?xml version="1.0" encoding="GBK"?>
<!-- This example uses the dataProvider to build the dataGrid columns dynamically -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" creationComplete="initApp()" >

<mx:Script><![CDATA[
   import mx.controls.dataGridClasses.DataGridColumn;
   import mx.controls.DataGrid;

   import mx.collections.XMLListCollection;
   import mx.collections.ArrayCollection;
   import mx.controls.Alert;
    
    //the dataProvider for the DG
   [Bindable]
  private var _xlcCatalog:XMLListCollection;  
  // the dataProvider for combobox
   [Bindable]
  private var _comboData:ArrayCollection;
  

  //run by creationComplete
  public function initApp():void
  {
  _xlcCatalog = new XMLListCollection(xmlCatalog.product);
  
  var aColumnDef:Array = getComboDatas(xmlCatalog.product[0]);
  _comboData = new ArrayCollection(aColumnDef);
  setFirstColumnBG(_comboData[0]);  
  }
  //get grid title name by xml head data
  private function getGridTitles(headRow:XMLList):Array{
     var titles:Array = new Array();                          
  var headRoot:XML = headRow[0];
  var eachHead:XMLList = headRoot.children();
  for (var i:int=0;i<eachHead.length();i++)  {    
    var headNode:XML = eachHead[i];                                        
      titles.push(headNode.toString());        
  }    
  return titles;
  }
  private function setFirstColumnBG(item:Object):void{
        
     for(var i:int=0;i<dg.columns.length;i++ ){
      var bgStyle:String = dg.columns[i].getStyle("backgroundColor");
      if(bgStyle!=null){
      dg.columns[i].clearStyle("backgroundColor");      
   }              
  }  
  dg.columns[item.data].setStyle("backgroundColor","#FFFF00");  
  var maxValue:int = getSpecificColumnMax(item.label);
  setSliderComp(maxValue);
  }

  private function getComboDatas(headRow:XML):Array{
  var titles:Array = new Array();                              
  var eachHead:XMLList = headRow.children();
  for (var i:int=0;i<eachHead.length();i++)  {    
    var headNode:XML = eachHead[i];
    var nodeText:Number = Number(headNode.toString());
    if(!isNaN(nodeText)){
      var title:Object = new Object();
   //the label used for diplay
      title.label = eachHead[i].name();  
   //the data used for set column bgcolor
      title.data = i;    
      titles.push(title);  
    }  
  }
    
  return titles;
  }
  private function getSpecificColumnMax(columnName:String):int{
  var maxValue:Number = 0;
  
  for(var i:int=0;i<_xlcCatalog.length;i++ ){
      var eachProduct:XML = _xlcCatalog[i];
   var productAttr:XMLList = eachProduct.children();
  
   for(var j:int=0;j<productAttr.length();j++){
       var eachCell:XML = productAttr[j];
       var origColumnName:String = eachCell.name();
    
    if(origColumnName==columnName){          
        var columnValue:Number = Number(eachCell.toString());    
        if(columnValue>maxValue){
        maxValue = columnValue;      
     }
    }
   }
  }
  return int(maxValue)+1;
  }
  private function setSliderComp(max:int):void{
  slider.maximum = max;
  slider.values = [0, max];
  slider.labels = ["0",String(max)];
  
  }

//save the selected column datafield for sort use, assigned by headerRelease event;
private var selectedColumn:String;
//sort column data
private function comparGridItem(itema:XML,itemb:XML):int{
     var filteredField:String = selectedColumn;  
  var itemValueA:int = int(itema[filteredField]);
  var itemValueB:int = int(itemb[filteredField]);
  if(itemValueA > itemValueB){
   return -1;
  }else if(itemValueA < itemValueB){
   return 1;
  }else{
   return 0;
  }  
  
}
//change combo data while drag the gridheader to change its sequence saved in combobox
private function changeColumnIndex():void{
     var comboItems:Array = new Array();
     for(var i:int=0; i<_comboData.length;i++){  
      var eachItem:Object = _comboData[i];  
  
   var comboField:String = eachItem.label;
   for(var j:int=0;j<dg.columns.length;j++){
       var eachColumn:DataGridColumn = dg.columns[j];
    var eachColumnField:String = eachColumn.dataField;    
    if(eachColumnField == comboField){      
     eachItem.data = j;    
     break;
    }
   }    
  }  
}
//manul filter grid items by slider values
private function refreshGridBySlider(sliderValues:Array):void{
    
     var startValue:int = int(sliderValues[0]);
  var endValue:int = int(sliderValues[1]);
     var filterField:String = columnSelecter.selectedItem.label;
  var lastData:XMLList = _xlcCatalog.source;
     var filterProducts:XMLList = getMultiConditionFilterData(filterField,startValue,endValue,lastData);  
     _xlcCatalog = new XMLListCollection(filterProducts);
  debugger.text = _xlcCatalog.length.toString()+" records";
  
}
//deal with multiple condition filter
private function getMultiConditionFilterData(filterField:String, startValue:int,endValue:int, lastData:XMLList):XMLList{
     var newRootXml:XML = <root/>;
  for(var i:int=0;i<lastData.length();i++){
      var eachProduct:XML = lastData[i];
   var filteredData:String = eachProduct[filterField];
   var filteredValue:int = int(filteredData);
   if(filteredValue>startValue && filteredValue<endValue){
       newRootXml.appendChild(eachProduct);
   }
  }
  return newRootXml.children();
}

//retrieve data by slider values from initial dataset
private function resetGridData():void{
     var sliderValues:Array = slider.values;
  var startValue:int = int(sliderValues[0]);
  var endValue:int = int(sliderValues[1]);
     var filterField:String = columnSelecter.selectedItem.label;
  var allProductsData:XMLList = xmlCatalog.product;
     var filterProducts:XMLList = getMultiConditionFilterData(filterField,startValue,endValue,allProductsData);  
     _xlcCatalog = new XMLListCollection(filterProducts);
  debugger.text = _xlcCatalog.length.toString()+" records";
}
//restore grid data to initial status
private function restoreGridData():void{
  var allProductsData:XMLList = xmlCatalog.product;
  _xlcCatalog = new XMLListCollection(allProductsData);
  debugger.text = _xlcCatalog.length.toString()+" records";
}

]]></mx:Script>
  <mx:HBox borderStyle="solid" height="30" width="100%">    
<mx:ComboBox id="columnSelecter" dataProvider="{_comboData}"
              change="setFirstColumnBG(ComboBox(event.target).selectedItem)" />
<mx:HSlider id="slider" width="180" thumbCount="2" snapInterval="1" minimum="0" allowTrackClick="true" liveDragging="false" labelOffset="0"  
          change="refreshGridBySlider(HSlider(event.currentTarget).values)"/>
<mx:Button id="reset" label="reset" click="resetGridData()"/>
<mx:Button id="restore" label="restore" click="restoreGridData()"/>
<mx:Label id="debugger" text=""/>
  </mx:HBox>
  <mx:Canvas id="gridParent" borderStyle="solid" height="450" width="100%" >
   <mx:DataGrid id="dg" width="100%" height="100%" rowCount="5" dataProvider="{_xlcCatalog}"
                headerRelease="selectedColumn=event.dataField"
       headerShift="changeColumnIndex()">
            <mx:columns>
                <mx:DataGridColumn dataField="time" headerText="Time"/>
                <mx:DataGridColumn dataField="ne" headerText="Region" />
                <mx:DataGridColumn dataField="price" headerText="Price" sortCompareFunction="comparGridItem"/>
    <mx:DataGridColumn dataField="deposit" headerText="Deposit" sortCompareFunction="comparGridItem"/>    
            </mx:columns>
        </mx:DataGrid>  
  </mx:Canvas>
  <mx:XML id="xmlCatalog">
<catalog>  
  <product productId="1">
   <time >2007-04-01</time>
   <ne>Bejing</ne>
   <price>99.99</price>
   <deposit>6000</deposit>  
  </product>
  <product productId="2">
   <time>2007-04-02</time>
   <ne>Shanghai</ne>
   <price>139</price>
   <deposit>5500</deposit>  
  </product>
  <product productId="3">
   <time>2007-04-03</time>
   <ne>Neimeng</ne>
   <price>39</price>
   <deposit>5000</deposit>  
  </product>
  <product productId="4">
   <time>2007-04-04</time>
   <ne>Guangzhou</ne>
   <price>159.99</price>
   <deposit>4500</deposit>  
  </product>
  <product productId="5">
   <time>2007-04-05</time>
   <ne>Tibet</ne>
   <price>59.99</price>
   <deposit>4000</deposit>  
  </product>
  <product productId="6">
   <time>2007-04-06</time>
   <ne>Shandong</ne>
   <price>59.99</price>
   <deposit>3000</deposit>  
  </product>
  <product productId="7">
   <time>2007-04-07</time>
   <ne>Wuhan</ne>
   <price>49.99</price>
   <deposit>2000</deposit>  
  </product>
  <product productId="8">
   <time>2007-04-08</time>
   <ne>Jinan</ne>
   <price>88.99</price>
   <deposit>1700</deposit>  
  </product>
  <product productId="9">
   <time>2007-04-09</time>
   <ne>Nanjing</ne>
   <price>59.99</price>
   <deposit>5700</deposit>  
  </product>
  <product productId="10">
   <time>2007-04-10</time>
   <ne>Huhehaote</ne>
   <price>25</price>
   <deposit>7800</deposit>  
  </product>
</catalog>
  </mx:XML>
</mx:Application>

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多