Hi all - I have two questions to post today, but will keep them 
separate.

I'm using some filter as you type code from Ben Forta and cflex.net.  
The following code is basically an InputText search box along with a 
combobox, and they both are filtering a datagrid's arraycollection.  
What I want to do is add a second combobox to the process.  It never 
seems to work correctly, but each combobox, along with the text 
search seems to work on their own.  Note that in the code below, the 
course combobox is commented out.

I suppose what I don't understand is how exactly the processFilter 
function works.


dgObjectList = DataGrid with 3 columns: objName, typeName, courseName
objectList = DataGrid's dataprovider

cbTypeList = Combobox with labelField=typeName.  Data includes typeID
typeListFilter = cbTypeList's dataprovider

cbCourseList = Combobox with labelField = courseName.  Data includes 
courseID
courseListFilter = cbCourseList's dataprovider

searchText = textInput box for keyword search.

Code is as follows.  Thanks for reading,
 - Chris

[Bindable]
private var objectList:ArrayCollection;
                
[Bindable]
private var typeListFilter:ArrayCollection;

[Bindable]
private var courseListFilter:ArrayCollection;

private function resultHandlerGetAllObjects(event:ResultEvent):void {
  objectList = event.result as ArrayCollection;
  /* add function for filtering */
  objectList.filterFunction=processFilter;
}
private function resultHandlerGetAllTypesFilter
(event:ResultEvent):void {
  typeListFilter = event.result as ArrayCollection;
}
private function resultHandlerGetAllCoursesFilter
(event:ResultEvent):void {
  courseListFilter = event.result as ArrayCollection;
}

/* Code from:
http://www.forta.com/blog/index.cfm/2006/7/13/Filtering-Data-In-Flex 
http://www.cflex.net/showFileDetails.cfm?
ObjectID=415&Object=File&ChannelID=1
*/

private function processFilter(item:Object):Boolean {
  var result:Boolean=false;
  dgObjectList.selectedIndex = -1;
                
  if(item.objName.length == 0 || item.objName.toUpperCase().indexOf
(searchText.text.toUpperCase()) >= 0) {
    if(cbTypeList.selectedItem.typeName != "Show All") {
      return item.typeName == cbTypeList.selectedItem.typeName;
    } else if(cbTypeList.selectedItem.typeName == "Show All") {
      return true;
    }
    /* Course ComboBox - works on its own, but not WITH the other 
combobox!                       
    if(cbCourseList.selectedItem.courseName != "Show All") {
      return item.courseName == cbCourseList.selectedItem.courseName; 
    } else if(cbCourseList.selectedItem.courseName == "Show All") {
      return true;
    } */
  }
  return result;
}

Code in App:
<mx:HBox width="100%">
  <mx:Label text="Search:"/>
  <mx:TextInput id="searchText" width="100%" 
change="objectList.refresh();"/>
</mx:HBox>
<mx:HBox width="100%">
  <mx:Label text="Type:"/>
  <mx:ComboBox id="cbTypeList" width="100%" 
dataProvider="{typeListFilter}" labelField="typeName" 
change="objectList.refresh();"/>
</mx:HBox>
<mx:HBox width="100%">
  <mx:Label text="Course:"/>
  <mx:ComboBox id="cbCourseList" width="100%" 
dataProvider="{courseListFilter}" labelField="courseName" 
change="objectList.refresh();"/>
</mx:HBox>
<mx:HBox width="100%" height="100%">
  <mx:DataGrid id="dgObjectList" width="100%" height="100%" 
dataProvider="{objectList}" change="displayObject();">
    <mx:columns>
      <mx:DataGridColumn headerText="Name" wordWrap="true" 
dataField="objName"/>
      <mx:DataGridColumn headerText="Type" dataField="typeName"/>
      <mx:DataGridColumn headerText="Course" dataField="courseName">
    </mx:columns>
  </mx:DataGrid>
</mx:HBox>




Reply via email to