`
edisundong
  • 浏览: 2006 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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

阅读更多
为感谢论坛发布
http://blog.csdn.net/edisundong/archive/2008/01/25/2065379.aspx

说明:

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

演示效果:



调用代码如下:

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); 

分享到:
评论
14 楼 yuanke 2009-01-17  
感谢啥,不能运行!
13 楼 dingchao.lonton 2009-01-12  
98行的确有错误,包缺少;错误
12 楼 hanjs 2009-01-11  
select支持多选吧,只是不是用下来框来显示的。不过可以设置一次显示多少个,好像是size。
11 楼 kimmking 2009-01-11  
<p>lovcombo</p>
<p> </p>
<p> </p>
10 楼 kimmking 2009-01-11  
官方论坛有了这个了。
半年前就用过。~、~
9 楼 boyee 2009-01-11  
这个组件怎么在ext2.2下面,选择框怎么没有出现
8 楼 woodman 2008-12-25  
98行少了一部分代码哦
7 楼 404liuli 2008-04-22  
为什么第98行出错?
6 楼 goodboy 2008-01-31  
调用代码是不是省略了阿
5 楼 dengddq 2008-01-28  
项目刚好需要这个多选下拉框,谢谢楼主,如果能够控制一下鼠标移到选项的效果,像Combo一样,那就完美了。
4 楼 baiuwl 2008-01-28  
一个下拉框就这么麻烦,还大叫EXT有多牛?
晕。。。
无语。。。
3 楼 godson_2003 2008-01-28  
98行代码有误,编辑器的原因?
2 楼 edisundong 2008-01-26  
实在不好意思,我是.net阵营的,dwr我没有接触过,你的意思是不是点击下拉框的时候lazy load??我也正在考虑lazy load的问题,不过最近太忙,而且其实这个控件有个bug,目前正在修复
1 楼 kaki 2008-01-25  
感谢分享。

我有一个问题:

我使用DWR返回json数据串,但是不知道如何让Ext.tree一次性loader返回的川。

希望能够获得您的指点。

相关推荐

    ext-----多选下拉框

    在EXT框架中,"多选下拉框"是一种常见的组件,它允许用户在下拉列表中选择多个选项,而不是仅限于单选。 在EXT中实现多选下拉框,主要涉及到EXT的`ComboBox`组件和`multiSelect`配置项。`ComboBox`是一个灵活的输入...

    layui-级联-多选下拉框.rar

    layui的插件效果,优化基础layui的原装组件的效果。 layui 是一款采用自身模块规范...其外在极简,却又不失饱满的内在,体积轻盈,组件丰盈,从核心代码到 API 的每一处细节都经过精心雕琢,非常适合界面的快速开发。

    js多选下拉框多选下拉框多选下拉框

    在网页开发中,多选下拉框是一种常见的交互元素,用户可以从中选择多个选项。JavaScript(简称js)作为客户端脚本语言,常被用来增强网页的交互性,其中包括实现多选下拉框的功能。本文将深入探讨如何使用JavaScript...

    layui多选下拉框样式,整套layui-select-multiple

    Layui是一个强大的前端UI框架,它提供了一系列美观且易于使用的组件,包括我们所讨论的多选下拉框。"layui-select-multiple"就是Layui专门为多选下拉框设计的一整套样式和功能。 首先,我们来看“layui多选下拉框...

    基于ext3.3的可多选下拉框js

    基于ext3.3的可多选下拉框js,可以从前台或者后台获取下拉框中数据

    EXT3.2 多选下拉框

    多选下拉框在EXT JS中通常通过`Ext.form.CheckboxGroup`或`Ext.form.RadioGroup`类来实现,但在EXT3.2中,实现多选下拉框功能通常会使用`Ext.form.FieldSet`或`Ext.form.ComboBox`的自定义扩展。这类组件提供了复选...

    jQuery多选下拉框插件

    **jQuery多选下拉框插件详解** 在Web开发中,多选下拉框是一种常见的交互元素,它允许用户在一组选项中选择多个值。jQuery作为最流行的JavaScript库之一,提供了许多插件来增强这种用户体验。`jquery.multi-select....

    各类多选下拉框代码1.zip

    本压缩包“各类多选下拉框代码1.zip”可能包含多种实现多选下拉框的代码示例,对于开发者来说,这些代码片段是非常实用的学习和参考资源。 一、多选下拉框的基本原理 多选下拉框通常由HTML的`&lt;select&gt;`标签构建,...

    Swing控件,多选下拉框

    要实现多选下拉框功能,我们需要自定义组件或者使用第三方库来扩展`JComboBox`的功能。 ### 一、自定义多选下拉框 自定义多选下拉框通常涉及以下几个关键步骤: 1. **创建自定义模型**:你需要创建一个自定义的`...

    layui-多选下拉框-xm-select-demo源码

    《layui-多选下拉框-xm-select:前端开发中的高效解决方案》 在现代Web开发中,用户界面的交互性和易用性是至关重要的。layui框架以其轻量级、高效和丰富的组件库,成为了众多开发者青睐的选择。尤其在构建多选...

    使用bootstrap实现多选下拉框

    在Bootstrap中实现多选下拉框可以极大提升用户体验,使得用户在有限的空间内可以选择多个选项。以下是如何使用Bootstrap来创建这样一个功能的详细步骤。 首先,确保你已经在你的项目中引入了Bootstrap的相关资源。...

    combobox Ext之扩展组件多选下拉框

    本篇将重点讲解ExtJS中的一个扩展组件——多选下拉框,即“combobox”。 在ExtJS中,ComboBox是一个基本的输入组件,它结合了文本输入框和下拉列表的功能。默认情况下,ComboBox只允许用户选择一个选项。但是,通过...

    CheckBoxList_WinForm多选下拉框_下拉多选_

    在Windows Forms(WinForm)开发中,经常需要创建具有多选功能的下拉框控件。这个场景下,我们可以自定义一个控件来实现“CheckBoxList”效果,即用户可以在下拉框中选择多个选项。下面我们将深入探讨如何实现这样一...

    ASP.NET多选下拉框自定义控件

    本文将深入探讨如何创建一个自定义的多选下拉框控件,以提升用户体验,并利用Ajax技术实现异步更新,提高页面的响应速度。 一、多选下拉框控件的理解 多选下拉框控件是一种允许用户从一系列选项中选择多个值的UI...

    jquery.multiselect.js多选下拉框选择代码

    《jQuery.multiselect.js:打造高效多选下拉框选择体验》 在Web开发中,下拉框(Dropdown)是常用的一种交互元素,尤其在需要用户从多个选项中进行选择时。然而,传统的HTML `&lt;select&gt;` 标签在处理大量选项或需要...

    ext多选下拉框(代码及例子)

    在"ext多选下拉框(代码及例子)"这个主题中,主要涉及到的知识点有: 1. **EXTJS的Combo组件**:Combo是EXTJS中的一种表单组件,它提供了下拉列表的功能,可以用于输入或者选择数据。它既可以作为单选也可以作为...

    jquery 多选下拉框实例

    1. **多选下拉框基础**: - 在HTML中,`&lt;select&gt;`元素通常用于创建单选的下拉列表,通过设置`&lt;select&gt;`的`multiple`属性,可以使其变为多选模式。例如: ```html &lt;option&gt;Option 1 &lt;option&gt;Option 2 ... `...

    js扩展多选下拉框

    在网页开发中,交互式组件是提升用户体验的关键因素之一,其中“js扩展多选下拉框”就是一个典型的实例。这个组件允许用户在一个下拉菜单中选择多个选项,从而提供了更丰富的数据输入方式。本文将详细讲解如何使用...

    jquery实现的多选下拉框

    安装完成后,我们可以通过简单的jQuery代码实现多选下拉框的功能。例如: ```html &lt;option value="value1"&gt;Option 1 &lt;option value="value2"&gt;Option 2 &lt;option value="value3"&gt;Option 3 $(document).ready...

    PB多选下拉框

    【51CTO下载-下拉多选控件】这个文件很可能是包含该多选下拉框控件的源代码或者可导入的PB组件。下载这个文件后,开发者可以将其导入到自己的PB项目中,然后根据需要进行定制和配置。通常,这样的组件会附带一些说明...

Global site tag (gtag.js) - Google Analytics