前段时间,老大召唤,给个任务,研究一下flex的combobox控件 实现复选功能(flex自带的combobox控件不可以复选),小兵能力有限,哪里可以扩展呀,网上看了别人写的,发现总是有点瑕疵(关键是还没有注释这个是最蛋疼的):
1.静态数据源正常,动态数据源 第一次点击时 没有取到数据,下拉列表为空。
2. ROLL_OVER ROLL_OUT 监听混乱,选择一项后下拉框突然收缩了,或者选择几项下拉框突然收缩了。
3.返回值有误,显示选中的项 与 实际返回选中的项不符
分析:
ROLL_OVER 与 ROLL_OUT 区别:
ROLL_OVER:就是鼠标从外部移入该组件才调用, ROLL_OUT 就是鼠标移到该组件外部才调用
另外 其他两个:MOUSE_OVER 与MOUSE_OUT 区别类似
ROLL_* 与MOUSE_* 的区别是:
MOUSE_*:鼠标 进入/移 出该组件时会调度MOUSE_*事件,即使是从其子组件移到该组件依然会触发该事件
ROLL_* :鼠标从不是其子组件的其余组件中进入该组件时会调度ROLL_*事件
下面是扩展后的代码,修复了上面提到的瑕疵:
必要部分已经加上了注释
MultipleComboBox.cs
package common
{
import flash.events.Event;
import flash.events.MouseEvent; import mx.collections.ArrayCollection;
import mx.controls.ComboBox;
import mx.core.ClassFactory;
import mx.events.FlexEvent;
import mx.events.ListEvent; public class MultipleComboBox extends ComboBox{
private var mouseOut:Boolean=false;
[Bindable]
private var promptText:String=""; //复选框收缩后显示label的值
private var selArr:Array=[]; //复选框选中值集合
private var splitStr:String="/"; //选中多个值 以此分割
public function MultipleComboBox(){
super();
this.addEventListener(FlexEvent.CREATION_COMPLETE,onCreateCompleteHandle);
//多选ComboBox 内嵌CheckBox实现
this.itemRenderer=new ClassFactory(CheckBoxItemRenderer);
}
private function onCreateCompleteHandle(event:FlexEvent):void{
dropdown.allowMultipleSelection=true;
close();
//
mouseOut=false; //置为false
}
//监听鼠标一入一出
private function initListener():void{
if(!dropdown.hasEventListener(MouseEvent.ROLL_OVER))
dropdown.addEventListener(MouseEvent.ROLL_OVER,onRollOverHandle);
if(!dropdown.hasEventListener(MouseEvent.ROLL_OUT))
dropdown.addEventListener(MouseEvent.ROLL_OUT,onRollOutHandle);
}
private function onRollOverHandle(event:MouseEvent):void{
mouseOut=false;
}
private var changeEvent:ListEvent;
//ROLL_OUT 更改选中值集合
private function onRollOutHandle(event:MouseEvent):void{
var list:ArrayCollection=ArrayCollection(this.dataProvider);
mouseOut=true;
var selectedStr:String = ""; //复选框收缩后的label,此处以"/"分割显示选中的值
selArr=[];//每次清空selArr保存的值
for each(var obj:Object in list) //遍历数据源,向selArr数组添加状态selected=true(选中)的值
{
if(obj.selected){
selectedStr += obj.Code+this.splitStr;
selArr.push(obj);
}
}
this.selectedItems=selArr;
this.promptText = selectedStr.substring(,selectedStr.length -) ; close(); //鼠标移出 收缩
//
mouseOut=false; //置为false changeEvent= new ListEvent( ListEvent.CHANGE )
dispatchEvent( changeEvent);
trace(this.text);
}
//ComboBox 带有selectedItems属性 但只实现selectedItem,此处实现selectedItems
public function set selectedItems(value:Array):void{
if (dropdown){
dropdown.selectedItems=value;
}
this.selArr=value;
} [Bindable("change")]
public function get selectedItems():Array{
return selArr;
}
override public function close(trigger:Event=null):void{
//initListener();
if (mouseOut){
super.close(trigger);
}
this.textInput.text=promptText;
this.toolTip = promptText;
initListener();//此处需要从上面注释处调整到这里,
//因为 CheckBoxItemRender中的 this.addEventListener(Event.CHANGE,onClickCheckBox)监听导致
//基数次单击时mouseOut=true; 直接下拉框收缩
}
override public function set prompt(value:String):void{
promptText=value;
}
public function set split(value:String):void
{
this.splitStr=value;
}
public function get split():String
{
return splitStr;
}
}
}
CheckBoxItemRenderer.cs:
package common
{
import flash.events.Event; import mx.collections.ArrayCollection;
import mx.controls.CheckBox;
import mx.controls.List;
import mx.utils.ArrayUtil; import configuration.FormatConfig; public class CheckBoxItemRenderer extends CheckBox{ /**存储当前列数据对象**/
private var currData:Object; public function CheckBoxItemRenderer(){
super();
this.addEventListener(Event.CHANGE,onClickCheckBox);
} override public function set data(value:Object):void{
if(value !=null)
{
this.selected = value.selected;
this.currData = value;
//此处CheckBox label显示code+name 可根据需要置
this.label=value.Code+" "+value.Name;
}
else
{
this.label=null;
}
}
//此属性可设置 数据源任意一项不可选 (enabled)
override public function set enabled(value:Boolean):void{ //
if(currData){
value=currData.enabled==false?false:true;
}
super.enabled=value;
}
/*更改被选中项的状态selected=true*/
private function onClickCheckBox(e:Event):void{
var list:ArrayCollection=ArrayCollection(List(this.parent.parent).dataProvider);//获取数据源
for each(var obj:Object in list)
{
//label的值为数据源中code + name 拼接的 所以此处判断某一项是否被选中的条件看上去有点怪
if((obj.Code+" "+obj.Name)==this.label){
if(this.selected){
obj.selected=true; //选中状态selected=true
}else{
obj.selected=false; //为选好
}
//break;
}
}
}
}
}
由于扩展的不够通用,所以使用的时候稍微做点处理
应用 Temp.mxml文件
<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:common="common.*"
creationComplete="module_creationCompleteHandler(event)"
xmlns:mywebservice="services.mywebservice.*">
<fx:Script>
<![CDATA[
import mx.rpc.soap.WebService;
import spark.components.Scroller;
import spark.components.VScrollBar;
import spark.events.IndexChangeEvent; [Bindable]
private var datacbbSource:ArrayCollection; private function ShowSelectItems2():void{
info2.text="";
info2.text+="选中了 "+myCombox2.selectedItems.length+" 个选项!\n";
for each(var item:Object in myCombox2.selectedItems){
info2.text+=ObjectUtil.toString(item)+"\n";
}
} var num=;
private function module_creationCompleteHandler(event:FlexEvent):void
{
GetDataResult.token = mywebservice.GetData(); //获取数据源
} [Bindable]
private var dataGrideSource:ArrayCollection; protected function GetAllShopsResult_resultHandler(event:ResultEvent):void
{
// TODO Auto-generated method stub
var result:ArrayCollection=event.result as ArrayCollection;
if (result == null || result.length == )
{
return;
}
this.datacbbSource=new ArrayCollection();
for each(var item in result)
{
datacbbSource.addItem({Code:item.Code,Name:item.Name,selected:false});
}
} ]]>
</fx:Script>
<fx:Declarations>
<s:CallResponder id="GetDataResult" result="GetDataResult_resultHandler(event)" />
<shopservice:MyWebService id="mywebService" />
</fx:Declarations>
<s:VGroup width="100%" height="100%" paddingLeft="" paddingRight="" paddingBottom="" paddingTop="">
<s:HGroup width="100%" color="black" verticalAlign="middle" height="">
<common:MultipleComboBox width="" id="myCombox2" split=";"
prompt="请选择" >
<s:ArrayCollection list="{datacbbSource}"/>
</common:MultipleComboBox>
<mx:Text id="info2"/>
<s:Button label="点击查看选择数据" click="ShowSelectItems2()"/>
</s:HGroup>
</s:VGroup>
</mx:Module >
运行结果就不上图了,下面这段
for each(var item in result)
{
datacbbSource.addItem({Code:item.Code,Name:item.Name,selected:false});
}
对数据源做了处理,强制转换成含有Code,Name,selected(默认值false)三个属性的对象,因为在CheckBoxItemRenderer.cs 和MultipleComboBox.cs文件中使用到的参数直接使用到了Code,Name,selected属性。
最后虽然最终这个没有应用到项目中,为了以后用到时方便,记录一下。
继续充电中。。。。
扩展代码参考:http://liu-yi126.iteye.com/blog/1305494
Flex 扩展combobox 实现复选功能的更多相关文章
-
QT 创建一个具有复选功能的下拉列表控件
最近研究了好多东西,前两天突然想做一个具有复选功能的下拉列表框.然后在网上"学习"了很久之后,终于发现了一个可以用的,特地发出来记录一下. 一.第一步肯定是先创建一个PROJECT ...
-
QComboBox实现复选功能(三种方法:嵌套QListWidget, 设置QStandardItemModel, 设置Delegate)
今天介绍一下一个小东西 — 如何让QComboBox实现复选功能? 需求: 下拉列表有复选功能 不可编辑 显示所有选中项 关于QComboBox的复选功能有几种方案: QStandardIte ...
-
QComboBox实现复选功能
需求: 下拉列表有复选功能 不可编辑 显示所有选中项 关于QComboBox的复选功能有几种方案: QStandardItemModel + QStandardItem QListWidget + ...
-
duilib 修复CTreeViewUI复选功能判断不准确的bug
转载请说明出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42265209 CTreeViewUI里面自带了复选的功能,但是复选功能存在 ...
-
在QComboBox的基础上实现复选功能
这个是最近的一个项目上需要实现的功能.要求如下: 下拉列表的项目可以多选 显示框不能编辑 所选中的项目在显示框中出现 下面根据网上的提示代码(参照博客 一去二三里),主要实现如下代码(与参照略有不同) ...
-
combobox添加复选框
问题: 需求提出要做一个下拉框可以多选的 解决方案: //机构树 function initOrgTree() { $('#reportOrg').combobox({ width: 200, edi ...
-
为DataGridView控件实现复选功能
实现效果: 知识运用: DataGridViewCheckBoxColumn类 实现代码: private class Fruit { public int Price { get; set; } p ...
-
个人永久性免费-Excel催化剂功能第58波-批量生成单选复选框
插件的最大威力莫过于可以把简单重复的事情批量完全,对日常数据采集或打印报表排版过程中,弄个单选.复选框和用户交互,美观的同时,也能保证到数据采集的准确性,一般来说用原生的方式插入单选.复选框,操作繁琐 ...
-
Qt之QTableView添加复选框(QAbstractTableModel)
简述 使用QTableView,经常会遇到复选框,要实现一个好的复选框,除了常规的功能外,还应注意以下几点: 三态:不选/半选/全选 自定义风格(样式) 下面我们介绍一下常见的实现方式: 编辑委托. ...
随机推荐
-
Ubuntu 查询 so 归属的 package
. . . . . 今天 LZ 在运行一个程序的时候,出现找不到 so 库的情况: >$ ./core ./core: error : cannot open shared object fil ...
-
shell学习之路:shell基础大全1
http://note.youdao.com/share/?id=a9d02257b639c94323c818bc38423919&type=note 别名命令alias:http://n ...
-
四 mybatis开发dao的方法
mybatis开发dao的方法 1.1 SqlSession使用范围 1.1.1 SqlSessionFactoryBuilder //以流的方式读取总的配置文件 Reader rea ...
-
Sklearn库例子1:Sklearn库中AdaBoost和Decision Tree运行结果的比较
DisCrete Versus Real AdaBoost 关于Discrete 和Real AdaBoost 可以参考博客:http://www.cnblogs.com/jcchen1987/p/4 ...
-
UVA 10061 How many zero&#39;s and how many digits ? (m进制,阶乘位数,阶乘后缀0)
题意: 给出两个数字a和b,求a的阶乘转换成b进制后,输出 (1)后缀中有多少个连续的0? (2)数a的b进制表示法中有多少位? 思路:逐个问题解决. 设a!=k. k暂时不用直接转成b进制. (1 ...
-
some words we should know
2010年,芬兰艺术家Mikko Kuorinki做了一件独特的艺术品. 他在赫尔辛基的奇亚斯玛当代艺术博物馆(Kiasma museum),找了一堵墙,装了一个175 x 320cm的木架子,上面用 ...
-
最全ASCLL码
结果 描述 实体编号 space ! exclamation mark ! " quotation mark " # number sign # $ dollar sign $ ...
-
Linux下python3与python3的多版本共存
python3已经出来有些许时候了,python3相比python2进行了大量的改进,包括语法,新的功能,还有优化.虽然很多库已经同时支持 python2和python3了,但是有些库仍然没有很好的支 ...
-
linux命令学习5-pssh命令
pssh命令是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,类似pdsh,个人认为相对pdsh更为简便,使用必须在各个服务器上配置好密钥认证访问. 1. ...
-
ios GCD简单介绍 后台运行~
本从实践出发简单说明: 首先,gcd是Grand Central Dispatch的缩写,意为多线程优化技术,是苹果为多核处理优化的技术.使用简单.清晰. 多线程就分同步.异步方法如下: //异步线程 ...