ext-2.0扩展多选下拉框(代码及演示)

说明:

感谢飞天色鼠和javaeye论坛的sp2,其实是改了飞天色鼠的代码。sp2给了很大帮助,感谢!

演示效果:

 ms

调用代码如下:

var auto_field=new Ext.form.MultiSelectField();
if(contextlist==null)
{
    auto_field.contextArray=
    [
      ['1','一'],
      ['2','二'],
      ['3','三']
    ]
}
else
{
    auto_field.contextArray=contextlist;
}
auto_field.fieldLabel=text;
auto_field.id=id;
auto_field.name=id;
return auto_field;

代码如下:

Ext.form.MultiSelectField = Ext.extend(Ext.form.TriggerField,  {  
    readOnly : true ,  
    defaultAutoCreate : {tag: "input", type: "text", size: "24", autocomplete: "off"},  
    displayField : 'text', 
    contextArray: undefined, //必须满足每行至少两列,第一、二列分别为[value,text]
    valueField : undefined,  
    hiddenName : undefined,  
    listWidth : undefined,  
    minListWidth : 50,  
    layerHeight : undefined,  
    minLayerHeight : 60,  
    value : undefined,  
    baseParams : {},  
    checkpanel:undefined,
    initComponent : function()
    {  
            Ext.form.MultiSelectField.superclass.initComponent.call(this);  
            this.addEvents
            (  
                    'select',  
                    'expand',  
                    'collapse',  
                    'beforeselect'       
            );  
            if(this.transform)
            {  
                this.allowDomMove = false;  
                var s = Ext.getDom(this.transform);  
                if(!this.hiddenName)
                {  
                    this.hiddenName = s.name;  
                }  
                s.name = Ext.id();   
                if(!this.lazyRender)
                {  
                    this.target = true;  
                    this.el = Ext.DomHelper.insertBefore(s, this.autoCreate || this.defaultAutoCreate);  
                    Ext.removeNode(s);   
                    this.render(this.el.parentNode);  
                }else{  
                    Ext.removeNode(s);   
                }  
            }  
    },  
    onRender : function(ct, position)
    {  
        Ext.form.MultiSelectField.superclass.onRender.call(this, ct, position);  
        if(this.hiddenName)
        {  
            this.hiddenField = this.el.insertSibling({tag:'input', type:'hidden', name: this.hiddenName, id: (this.hiddenId||this.hiddenName)},  
                    'before', true);  
            this.hiddenField.value =  
                this.hiddenValue !== undefined ? this.hiddenValue :  
                this.value !== undefined ? this.value : '';  
            this.el.dom.removeAttribute('name');  
        }  
        if(Ext.isGecko){  
            this.el.dom.setAttribute('autocomplete', 'off');  
        }  
        this.initList();  
    },  
    initList : function()
    {  
        if(!this.list)
        {  
            var cls = 'x-multiselectfield-list';  
            this.list = new Ext.Layer
            ({  
                shadow: this.shadow, cls: [cls, this.listClass].join(' '), constrain:false  
            });  
            var lw = this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth);  
            this.list.setWidth(lw);  
            this.list.swallowEvent('mousewheel');  
            this.innerList = this.list.createChild({cls:cls+'-inner'});  
            this.innerList.setWidth(lw - this.list.getFrameWidth('lr'));  
            this.innerList.setHeight(this.layerHeight || this.minLayerHeight);  
            if(!this.checkpanel)
            {  
                this.checkpanel = this.CheckPanel(this.innerList);      
            }  
            this.checkpanel.render();  
        }  
    },  
    onSelect:function(id,text,checked)
    {  
            this.setValue(id,text,checked);  
    },  
    CheckPanel:function(el)
    {  
        var checkpanel = new Ext.Panel
        ({  
            el:el,  
            autoScroll:true
        }); 
        var multiselectField = this;
        if(typeof this.contextArray != 'undefined')
        {
            for(var i=0;i            {
                var contArry=this.contextArray[i];
                var auto_field=new Ext.form.Checkbox
                ({
                    boxLabel:contArry[1],
                    id:contArry[0],
                    name:contArry[0],
                    cls :'x-multiselectfield-list'
                });
                auto_field.on('check',function(auto_field)
                {  
                    multiselectField.onSelect(auto_field.id,auto_field.boxLabel,auto_field.checked);
                });  
                checkpanel.add(auto_field);          
            }
        }
        return checkpanel
    },  
    getValue : function()
    {  
        if(typeof this.value != 'undefined')
        {  
            return this.value;  
        }
        else
        {  
            return Ext.form.MultiSelectField.superclass.getValue.call(this);  
        }  
    },  
    setValue : function(id,text,ischecked)
    {  
        var text = text;  
        var value = id; 
        var return_text_string;
        var return_value_string;

        var text_temp    = Ext.form.MultiSelectField.superclass.getValue.call(this); 
        var ids_temp     = typeof this.value != 'undefined' ? this.value : '';
        var text_arrtemp = text_temp.split(",");
        var ID_arrtemp   = ids_temp.split(",");
        if(ischecked)
        {     
            Array.add(text_arrtemp,text);
            Array.add(ID_arrtemp,value);
        }
        else
        {
            Array.remove(text_arrtemp,text);
            Array.remove(ID_arrtemp,value);      
        }
        return_text_string  = text_arrtemp.toString();
        return_value_string = ID_arrtemp.toString();
        var first_text_str  = return_text_string.substr(0,1);
        var first_value_str = return_value_string.substr(0,1);
        if(first_text_str==",")
        {
          return_text_string=return_text_string.substr(1);
        }
        if(first_value_str==",")
        {
          return_value_string=return_value_string.substr(1);
        }
        Ext.form.MultiSelectField.superclass.setValue.call(this, return_text_string);  
        this.value = return_value_string;
        if(this.hiddenField)
        {  
            this.hiddenField.value = return_value_string;  
        }  

    },    
    onDestroy : function()
    {  
        if(this.list)
        {  
            this.list.destroy();  
        }  
        Ext.form.MultiSelectField.superclass.onDestroy.call(this);  
    },  
    collapseIf : function(e)
    {  
        if(!e.within(this.wrap) && !e.within(this.list))
        {  
            this.collapse();  
        }  
    },  
    expand : function()
    {  
        if(this.isExpanded() || !this.hasFocus)
        {  
            return;  
        }  
        this.list.alignTo(this.wrap, this.listAlign);  
        this.list.show();  
        Ext.getDoc().on('mousewheel', this.collapseIf, this);  
        Ext.getDoc().on('mousedown', this.collapseIf, this);  
        this.fireEvent('expand', this);  
    },  
    collapse : function()
    {  
        if(!this.isExpanded())
        {  
            return;  
        }  
        this.list.hide();  
        Ext.getDoc().un('mousewheel', this.collapseIf, this);  
        Ext.getDoc().un('mousedown', this.collapseIf, this);  
        this.fireEvent('collapse', this);  
    },  
    isExpanded : function()
    {  
        return this.list && this.list.isVisible();  
    },  
    onTriggerClick : function()
    {  
        if(this.disabled)
        {  
            return;  
        }  
        if(this.isExpanded())
        {  
            this.collapse();  
        }
        else
        {  
            this.onFocus({});  
            this.expand();  
        }  
        this.el.focus();  
    }  
});  
Ext.reg('multiselectfield', Ext.form.MultiSelectField);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值