`
mad_Roy
  • 浏览: 12814 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

带搜索功能的下拉树的实现

 
阅读更多

要做个下拉框带树结构的控件。

找了几个组件拼凑了个出来了。

 

 

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx"
			   creationComplete="init()"  
			   width="400" height="300"
			   showStatusBar="false">
	<fx:Script>
		<![CDATA[
			import flashx.textLayout.operations.CutOperation;
			import flashx.textLayout.operations.DeleteTextOperation;
			import flashx.textLayout.operations.FlowOperation;
			
			import mx.collections.ArrayCollection;
			import mx.collections.ArrayList;
			import mx.collections.IList;
			import mx.collections.XMLListCollection;
			import mx.events.ListEvent;
			import mx.utils.StringUtil;
			
			import spark.events.TextOperationEvent;
			
		 	[Bindable]
			private var xm:XML = 
				<root> 
						<league label="全公司" data="1234" isdep="true"> 
								<division label="开发" data="2234" isdep="true"> 
										<team label="应用" data="2234" isdep="true"/> 
										<team label="系统" data="1" isdep="true"/> 
										<team label="测试" data="234" isdep="true"> 
												<team label="研发吗" data="34" isdep="false"/>
												<team label="研发里面" data="56" isdep="false"/>
												<team label="研发里" data="153" isdep="false"/>
										</team>
										<team label="支撑" data="214" isdep="true"/> 
								</division> 
								<division label="销售"> 
										<team label="浙江" data="89" isdep="true"/> 
										<team label="cfdw" data="76" isdep="true"/> 
										<team label="江苏" data="1255" isdep="true"/> 
										<team label="上海" data="164" isdep="true"> 
												<team label="上海1" data="34" isdep="false"/>
												<team label="上海12" data="56" isdep="false"/>
												<team label="上海2" data="153" isdep="false"/>
										</team>
										<team label="Kansas" data="17834" isdep="false"/> 
								</division> 
								<division label="财务" data="1y4" isdep="true"> 
										<team label="tobg" data="1gf4" isdep="false"/> 
										<team label="tyue" data="5" isdep="false"/> 
										<team label="Toronto" data="134" isdep="false"/> 
										<team label="tyar" data="4" isdep="false"/> 
										<team label="Tampa Bay" data="ui" isdep="false"/> 
								</division> 
								<division label="产品" data="734" isdep="true"/> 
								<division label="cds" data="120" isdep="false"/> 
						</league> 
				</root>
			; 
			
			
			[Bindable]
			public var selectedNode:XML;
			
			[Bindable]
			private var a:XMLList = new XMLList();
			
			[Bindable]
			private var b:XMLListCollection = new XMLListCollection();
		
			[Bindable]
			private var c:ArrayCollection = new ArrayCollection();
			
			[Bindable]
			private var bp:ArrayCollection = new ArrayCollection();
			
			private function init():void
			{
				a = xm.league; 
				b = new XMLListCollection(a); 
				c = new ArrayCollection(b.toArray());

				this.addEventListener(MouseEvent.MOUSE_DOWN, focusOut);
			}
			
			private function focusOut(event:MouseEvent):void
			{
				if(event.currentTarget.id != 'treelist' && event.currentTarget.id != 'relist')
				{
					result.displayPopUp = false;
					frmPUA.displayPopUp = false;
				}
			}
			
			protected function openBtn_clickHandler(event:MouseEvent):void
			{
//				if(result.displayPopUp || frmPUA.displayPopUp)
//				{
//					result.displayPopUp = false;
//					frmPUA.displayPopUp = false;
//				}else
//				{
					frmPUA.displayPopUp = true;
//				}
			}
			
			protected function textin_changeHandler(event:TextOperationEvent):void
			{
				var operation:FlowOperation = event.operation;

				if (operation is DeleteTextOperation || operation is CutOperation)
				{
					result.displayPopUp = false;
				}
				else 
				{
					if (result.displayPopUp = false)
					{
						result.displayPopUp = true;
						return;
					}   

					var keyWord:String = StringUtil.trim(textin.text);  
					if(keyWord!='')
					{
						searchKeyWord(keyWord);
					}
					else
					{
						result.displayPopUp =false;
					}
				}
			}
			
			private function searchKeyWord(keyWord:String):void
			{  
				bp.removeAll();
				bp = filterData(c,keyWord); 
//				var typedLength:int = textin.text.length;
//				var ob:XML = new XML();
				if(bp.length > 0)
				{  
//					搜索时可以让输入框内文字变化,见spark的combobox组件源码
//					ob = bp[0] as XML; 
//					var itemString:String = ob.@label;
//					textin.selectAll();
//					textin.insertText(itemString);
//					textin.selectRange(typedLength, itemString.length);
					
					frmPUA.displayPopUp = false;
					result.displayPopUp = true;
					
					textin.addEventListener(KeyboardEvent.KEY_UP, changeFocous);
				}
				else
				{
					frmPUA.displayPopUp = false;
					result.displayPopUp = false;
					if(selectedNode)
					{
						textin.text = selectedNode.@label;
					}
					else
					{
						textin.text = '';
					}
				}
			}  
			
			private function changeFocous(event:KeyboardEvent):void
			{  
				if(event.keyCode == 40 || event.keyCode == 13)
				{
					relist.setFocus();
					relist.selectedIndex = 0;
				}
			}
			
			private function filterData(ac:ArrayCollection, keyword:String):ArrayCollection
			{  
				var xm:XML = ac[0] as XML;
				find(xm, keyword);
				return bp; 
			}
			
			// 递归遍历xml
			private function find( node:XML, keyword:String ):void 
			{
				for each ( var element:XML in node.elements( ) ) 
				{
					var str:String = element.@label;
					
					//区分大小写时 str.indexOf(keyword)
					//不区分大小写 str.search(new RegExp(keyword,"gi")
					if(str.search(new RegExp(keyword,"gi")) != -1 )				
					{  
//						可以根据在xml标签里定义哪些可以被搜索
//						if(element.@isdep == 'false')
//						{
							var item:Object = element as Object;
							
							if(str == keyword)//出现完全匹配但不在队列前端的将其加到列表最前端
							{ 
								bp.addItemAt(item,0);
							}else
							{
								bp.addItem(item); 
							}
//						}
					}  
					
					find( element,keyword );
				}
			} 
			
			private function listchange(e:ListEvent):void
			{
				selectedNode = Tree(e.target).selectedItem as XML;
				textin.text = selectedNode.@label;
				frmPUA.displayPopUp = false;
			}

			
			protected function relist_clickHandler(event:MouseEvent):void
			{
				selectedNode = relist.selectedItem as XML;
				textin.text = selectedNode.@label;
				result.displayPopUp = false;
			}
			
			protected function relist_keyUpHandler(event:KeyboardEvent):void
			{
				if(event.keyCode == 13)
				{
					selectedNode = relist.selectedItem as XML;
					textin.text = selectedNode.@label;
					result.displayPopUp = false;
				}
			}
			
		]]>
	</fx:Script>
	
	<fx:Declarations>
		<mx:Tree  id="tree1" dataProvider="{c}"  width="150" labelField="@label"
				  selectedIndex="0"  />   
	</fx:Declarations>

	
	<s:Panel x="10" y="10" width="90%" height="90%" title="My ComBoTree Selector Example">        
	
			<s:Group id="vg" x="10" y="10">
			
				<s:TextInput x="0" y="0" width="130" height="20" id="textin" change="textin_changeHandler(event)"/>
				<s:Button x="130" y="0" id="openBtn" width="20" height="20" label="O" 
						  click="openBtn_clickHandler(event)"/>
				
				<s:PopUpAnchor id="frmPUA" x="0" y="20" popUpWidthMatchesAnchorWidth="true"  
							   popUpPosition="topLeft" width="150" height="200">
					
					<mx:Tree  id="treelist" dataProvider="{c}" maxHeight="200" labelField="@label"
							  selectedIndex="0" change="listchange(event)"/>   
				</s:PopUpAnchor>    
				<s:PopUpAnchor id="result" x="0" y="20" popUpWidthMatchesAnchorWidth="true" 
							   popUpPosition="topLeft" width="150" height="200">
					
					<s:List  id="relist" dataProvider="{bp}" height="100%" width="100%"  maxHeight="200"
							 labelField="@label" selectedIndex="-1" keyUp="relist_keyUpHandler(event)"
							 click="relist_clickHandler(event)"/>   
				</s:PopUpAnchor> 
			</s:Group>
			
			
			
			<!--<mx:PopUpButton width="150" popUp="{tree1}" label="{tree1.selectedItem.@label}"/> -->
		
	</s:Panel>   
	
</s:WindowedApplication>
 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    bootstrap框架下带搜索功能的下拉树插件

    本文将详细讲解如何在Bootstrap环境下实现一个带有搜索功能的下拉树插件,并基于`bootstrap-select`和`bootstrap-treeview`两个库进行介绍。 首先,`bootstrap-select`是Bootstrap官方推荐的一个下拉菜单增强插件,...

    bootstrap框架下带搜索功能的下拉树插件.zip

    3. **实现带搜索功能的下拉树** 在这个插件中,`bootstrap-select`和`bootstrap-treeview`结合在一起,形成了一个具有搜索功能的下拉树。用户可以在下拉菜单中输入搜索词,插件会即时过滤出匹配的树节点。这种组合...

    bootstrap treeview可搜索下拉树形

    可能包含Bootstrap的HTML模板和jQuery代码,实现搜索功能和树形视图的交互。 8. **表结构及数据**:这部分可能包括数据库的设计和样本数据,例如SQL脚本创建的表格结构以及填充到表中的数据。这些数据被用来初始化...

    EasyUI 下拉菜单 下拉树 模糊搜索

    支持下拉菜单 下拉树 模糊搜索,支持中间字段的匹配

    jquery下拉多级树选择插件(支持左右移动,以及模糊搜索功能).zip

    4. **实时更新**:当用户在搜索框中输入时,下拉树会实时更新显示结果,用户可以即时看到搜索结果的变化,而不需要额外的提交操作。 5. **可定制化**:作为一个插件,它应该提供丰富的配置选项,允许开发者根据实际...

    select下拉带模糊搜索功能

    在网页开发中,"select下拉带模糊搜索功能"是一个常见的需求,特别是在用户需要从大量选项中快速选择某一特定项时。这个功能提高了用户体验,使查找和选择变得更加便捷。本项目通过HTML、JavaScript(可能包括jQuery...

    extjs4 实现下拉树并支持复选

    在EXTJS4中,实现一个下拉树(Combobox Tree)并支持多选和复选功能,主要是通过自定义组件(Ext.define)来完成的。这个组件继承自EXTJS的Picker字段(Ext.form.field.Picker),并添加了树形结构和复选功能。以下...

    Flex ComBox 下拉树功能

    要实现Flex ComBox的下拉树功能,我们需要以下几个关键步骤: 1. 引入库:首先,确保在你的项目中包含了Flex SDK的相关库,特别是包含Tree组件的库,例如mx.controls.Tree。 2. 创建Tree对象:在代码中创建一个...

    comboxTree下拉树,实现单选功能

    在ComboxTree中,我们首先需要创建一个配置对象,定义下拉树的基本属性,如store(数据源)、displayField(用于显示的字段)、valueField(用于存储值的字段)等。同时,为了实现单选,我们需要禁用多选选项,可以...

    layui+ztree下拉树,支持单选和多选

    `layui`和`ztree`这两个工具结合,可以实现一个功能强大的下拉树组件,支持单选和多选,大大提升了用户体验。本文将详细介绍如何利用`layui`和`ztree`来构建这样的组件,并探讨其关键技术和应用场景。 `layui`是一...

    Select 下拉树 Ztree

    - 高级搜索:提供模糊搜索功能,快速定位所需节点。 在实际项目中,ZTree不仅可以应用于下拉菜单,还可以用作文件管理、组织架构展示、权限控制等多种场景。通过深入学习和熟练掌握ZTree的API和配置选项,可以打造...

    layui树形下拉菜单完整实例

    在“layui树形下拉菜单完整实例”中,我们主要关注的是如何将tree组件与下拉菜单相结合,实现如初始化、动态赋值以及获取选中值等关键功能。 首先,让我们了解layui的tree组件。tree组件是layui提供的一种用于展示...

    wpf_combobox_tree下拉树形控件

    对于树形ComboBox,我们需要创建一个模板,包含一个TextBox(显示当前选择)和一个Popup(作为下拉树形列表)。这个模板需要使用HierarchicalDataTemplate来展示树形数据。 2. **数据绑定**:WPF提供了强大的数据...

    下拉树形列表

    3. **搜索功能**:提供搜索框,让用户能快速定位到目标节点。 4. **样式定制**:为了满足不同的设计需求,下拉树形列表应提供足够的自定义样式选项。 5. **无障碍访问**:确保键盘导航和屏幕阅读器兼容,符合WCAG...

    帆软报表填报预览下的懒加载下拉树控件

    实现懒加载下拉树控件的关键在于以下几个方面: 1. **异步数据加载**:当用户展开树节点时,通过异步请求获取该节点的子节点数据,而不是在初始化时一次性加载所有数据。 2. **缓存管理**:对已加载的节点数据进行...

    ExtJs下拉树

    - **ComboBoxTree.js:** 这是实现下拉树功能的主要JavaScript文件,它定义了自定义的ComboBoxTree组件,包含了构造函数、配置项、方法等,用于创建和操作下拉树。 - **ComboBoxTree-min.js:** 这是压缩后的版本,...

    extjs下拉树

    在ExtJS中,下拉树是通过`Ext.form.field.Tree`类实现的,它继承自`Ext.form.field.ComboBox`,增加了树状结构的功能。`ComboTree.js`可能就是实现了这个功能的JavaScript文件,包含了一些定制化的代码或扩展。 ...

    基于ztree开发的下拉树控件ztree-select

    【基于ztree开发的下拉...通过这些配置,你可以实现一个符合业务需求的、具有搜索功能的下拉树控件。同时,由于ztree-select是基于ztree的,所以它也继承了ztree的灵活性和可扩展性,能够适应复杂多变的前端应用场景。

    Extjs下拉多选树

    9. **交互设计**:优化用户体验是关键,如通过添加搜索功能让用户更容易找到目标节点,或者提供分页以处理大量数据。 10. **响应式设计**:确保下拉多选树在不同屏幕尺寸和设备上都能良好地工作,可能需要应用ExtJS...

    jQuery多功能搜索框插件下拉菜单选择代码

    本篇文章将深入解析名为"jQuery多功能搜索框插件下拉菜单选择代码"的项目,通过分析压缩包中的文件,揭示其工作原理和实现方式。 首先,项目中包含的主要CSS文件有`bootstrap.min.css`和`jquery.dropdown.css`。`...

Global site tag (gtag.js) - Google Analytics