`
literary_fly
  • 浏览: 92571 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

可输入可联想的下拉列表的实现——Ext ComboBox

阅读更多
网上这样的控件不少,有很多实现方法,其中不少的很巧妙。
    例如:在文本框(HTML INPUT)后,添加一个隐藏层,隐藏层上放一个下拉列表,存储了所有可能的元素,每次文本框触发onpropertychange事件,就是对隐藏层上下拉列表数据的过滤显示。而选择下拉列表,则对文本框进行赋值......然后我们可以通过一些CSS技巧,将它的外观调整成一个可输入可联想下拉列表的模样。

    当然,本文并不打算对上述实现方式进行讨论,而是将EXT中一些实用的控件,“便宜地”添加到我们的项目中来(EXT版本1.1.1)。是的,我强调的是“便宜”!

    EXT上有一种控件ComboBox,就包含了这样的特性,而我们要使用它,标准的做法是:

    1. 首先,你需要将ext-1.1.1(如果你要使用它的样式,那么里面的resource是必须的——样式定义,以及它所依赖的图片都放在里面)添加到项目中来,在需要使用ComboBox的页面添加JS(必须)和CSS引用路径:

<link rel="stylesheet" type="text/css" href="../js/ext-1.1.1/resources/css/ext-all.css" />

<script type="text/javascript" src="../js/ext-1.1.1/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="../js/ext-1.1.1/ext-all.js"></script>
    注意路径哦!

    2. 你需要一个载体,EXT就是这样,布局需要document.body,Grid需要<div>,而ComboBox则需要一个<input type="text">:

<input type="text" id="local1"/>
    3. 新建一个JS文件,其间包括对存储结构的定义和ComboBox属性的定义:

Ext.onReady(function(){
         Ext.QuickTips.init();
   
        var data =
         [
                 ['1','Lislie','D005','male'],
                 ['2','Merry','D004','female'],
                 ['3','Edison','D003','male'],
                 ['4','Mark','D002','male'],
                 ['5','Leeon','D001','male']
         ];

        // 格式化数据
    var ds = new Ext.data.Store({
                 proxy: new Ext.data.MemoryProxy(data),          // 数据源
         reader: new Ext.data.ArrayReader({}, [             // 如何解析
             {name: 'id'},
                         {name: 'name'},
                         {name: 'depno'},
                         {name: 'sex'}                              
         ])
         });
         ds.load(); 
   
        var storeList = new Ext.form.ComboBox({       
                 store: ds,
                 valueField:'id',       // option.value
                 typeAhead: true,
                 displayField: 'name',      // option.text
                 triggerAction: 'all',
                 emptyText:'Select a store...',
                 mode: 'local',
                 selectOnFocus:true,
                 width:135
         });
   
         storeList.applyTo('local1');
});

    上面的数据来源是一个写死的2维数组。同样的道理,你的数据源可以来自一个链接——请求一个页面,而该页面的Response返回一个符合Json格式的字符串(EXT里面最常用的存储方式是JSON),那么Ext.data.Store的定义就变成了这样: var store = new Ext.data.Store({
         proxy:new Ext.data.ScriptTagProxy({     url:'http://localhost:17319/KBS/Grid/EditString.aspx'}),    // 数据源
         reader: new Ext.data.JsonReader({      // 解析格式
             totalProperty : 'totalCount',                // 用于分页  
             root : 'root',
             id : 'id'
         },
         [
                 {name: 'id'},
                 {name: 'name'},
                 {name: 'depno'},
                 {name: 'sex'}
         ])
});    如此,需要请求页面返回的String符合这样的格式,例如: {
         'totalProperty':100,
         'root':[
                 {'id':'a1', 'name':'Lislie', 'depno':'D001', 'sex':'Male'},
                 {'id':'a2', 'name':'Merry', 'depno':'D002', 'sex':'Female'},
                 {'id':'a3', 'name':'Jone', 'depno':'D003', 'sex':'Female'},
                 {'id':'a4', 'name':'Mark', 'depno':'D004', 'sex':'Male'}
         ]
}
    网上有不少将DataTable或Model转JSON的工具类,当然也也可以自己写,反射+字符串的拼接。

    3. 最后,将这个JS引用到页面上。那么一个可输入可联想的控件便出来了。这里有一个小的BUG(暂且用这个词吧),ComboBox终究是放在一个<input>上。

    在前台,你可以通过storeList.getValue()获取当前的选中项的option.value(如果是手动输入的项,而非经过联想选中的项,storeList.getValue()得到的是'',你只能获取到storeList.getRawValue()即<input>的value。需要在点击保存按钮时,在onclick事件中将两者的值设置为一致:“onclick='javascript:storeList.setValue(storeList.getRawValue);'”)。

    而在后台,你无法像操作<select>一样,获取它的option.value,而只得到它的text。也只能操作这个Text了。

    总结:如果你的数据库操作放在前台,那么你完全可以将ComboBox当成一个<select>(功能更强大,允许你输入不存在的项)。如果你的数据库操作放在后台,那么,你只能操作它的Text了,而所谓的可联想、可输入下拉列表,其实是一个糊弄人的文本框而已。

    ------------------------------------------------------------------------------

    老实说,上面的实现过程还是很麻烦,这里有一个很简单的实现方式——其实EXT研发小组已经替我们完成了这一步,是的,仔细看API,你会发现:

    你可以将一个带数据的<select>轻松的转化为ComboBox,哪怕它是asp的控件<asp:DropdownList>。而这个转化过程,就是ComboBox的一行属性:

var storeList;

Ext.onReady(function(){
         Ext.QuickTips.init();
         storeList = new Ext.form.ComboBox({   
                 typeAhead: true,
                 triggerAction: 'all',
                 emptyText:'Select a store...',
                 mode: 'local',
                 selectOnFocus:true,
                 transform:'AList',         // 将已存在select(通过id)直接转ComboBox
                 width:135
         });
})
    缺陷是,手动输入的不存在的项,在后台无法取到。

    两种方式区别:由于载体的不同,一个<input>,一个<select>,导致在后台,我们取值方法和取的内容也不同。虽然说,两者在外观和功能上一模一样,但后者才能真正算可输入可联想的下拉列表吧!

  • 大小: 4.9 KB
分享到:
评论

相关推荐

    Ext combobox 下拉多选框带搜索功能

    ComboBox在Ext JS中是一个常用的组件,通常用于展示一组可选项,用户可以通过输入文字或者点击下拉列表来选择。而“下拉多选框”意味着这个ComboBox支持多选模式,用户可以选择多个值而不是仅限于一个。结合“带搜索...

    ext多选下拉列表的全选功能实现

    "ext多选下拉列表的全选功能实现"这个主题聚焦于一个特定的UI组件——ExtJS库中的MultiComboBox,这是一种允许用户多选的下拉列表控件。在实际应用中,全选功能常常被用来快速选择所有选项,极大地提高了用户的操作...

    Ext comboBox的remote模式,联想功能实现

    然后,comboBox将更新其下拉列表,显示与用户输入相匹配的选项。 在实际开发中,服务器端也需要编写相应的接口来处理这些请求,通常涉及到数据库查询或其他数据处理逻辑,以返回与用户输入关键词匹配的数据集。 ...

    c#可输入的下拉列表框

    "C#可输入的下拉列表框"是一种交互式控件,它结合了传统的下拉列表功能和文本输入框的功能,允许用户既可以从中选择已有的选项,也可以自由输入新的值。这种控件在提高用户体验和数据输入灵活性方面起到了重要作用。...

    delphi7实现 combobox下拉hint.

    在Delphi 7中,`ComboBox`控件是常见的用户...通过以上步骤,我们就成功地在Delphi 7的`ComboBox`下拉列表中实现了自定义的提示信息显示。这个功能可以极大地提升应用的易用性,让用户在选择列表项时获取更丰富的信息。

    vs2008演示ComboBox下拉列表控件的使用实例

    在Visual Studio 2008(VS2008)中,ComboBox是一个非常常见的控件,它结合了文本框和下拉列表的功能,允许用户在输入文本的同时选择预定义的选项。这个“vs2008演示ComboBox下拉列表控件的使用实例”将向我们展示...

    DataGridView控件中加入ComboBox下拉列表框

    在本篇文章中,我们将深入探讨如何在`DataGridView`中集成`ComboBox`下拉列表框,以及相关的实现细节和应用场景。 首先,我们需要理解`DataGridView`和`ComboBox`的基本用法。`DataGridView`是一个可自定义的数据...

    在DataGridView控件中加入ComboBox下拉列表框的实现案例

    本案例将详细介绍如何在`DataGridView`中实现`ComboBox`下拉列表的功能。 首先,我们需要创建一个`DataGridView`控件,并将其添加到窗体上。接着,我们需要创建一个`ComboBox`控件,用于存储可供选择的值。这可以...

    WPF 下拉列表框ComboBox扩展控件

    用户可以输入文本,或者从下拉列表中选择一个预定义的选项。在默认情况下,ComboBox仅支持简单的文本项,但通过自定义控件和模板,我们可以将其功能扩展到包含更复杂的数据结构。 扩展ComboBox的关键在于自定义控件...

    Ext组合框comboBox带分页

    用EXT来实现下拉框ComboBox 下拉框可以实现分页

    C#+ComboBox联想输入+代码类

    在IT领域,ComboBox是一个常用的控件,常用于GUI(图形用户界面)设计,它结合了下拉列表和文本框的功能,允许用户从预定义的选项中选择或输入自定义值。"C#+ComboBox联想输入+代码类"这个主题是关于在C#编程环境下...

    带选择项CheckBox的下拉列表ComboBox控件

    本话题聚焦于一个特定的UI组件,即“带选择项CheckBox的下拉列表ComboBox控件”。这个控件结合了两种常见的界面元素:CheckBox和ComboBox,提供了一种更灵活的选择方式,特别是在需要用户从多个选项中进行多选时。 ...

    Combobox下拉列表显示图片.zip

    这个"Combobox下拉列表显示图片.zip"文件可能包含了实现这一功能的代码示例或教程。 在Windows Forms应用程序中,Combobox默认只支持显示文本,但通过自定义绘制或者使用第三方控件,我们可以实现显示图片与文本...

    C# combobox下拉列表中可添加图片

    一款非常实用的C# 的combobox的第三方控件,可以实现下拉后在下拉框中添加图片的功能,忘对有此功能需求的朋友所有帮助。

    在DataGridView控件中加入ComboBox下拉列表框的实现

    这种实现方式允许用户在编辑单元格时看到并选择下拉列表中的选项,提高了数据输入的效率和准确性。 总结一下,本篇文章主要介绍了如何在C#的Windows Forms应用程序中,将`ComboBox`控件集成到`DataGridView`中,...

    flex实现 ComboBox中下拉checkbox

    在Flex编程领域,ComboBox是一个常用的组件,它提供了一个下拉列表供用户选择,通常用于实现单选功能。然而,有时我们需要在ComboBox中嵌入多选功能,这时可以通过添加Checkbox来实现。本文将深入探讨如何在Flex中的...

    改变ComboBox下拉高度/强行展开下拉表/自动查询列表/多列下拉框/XP风格Combobox/带图标的ComboBox

    这个主题涵盖了几个关于ComboBox的高级特性和定制方法,包括改变下拉高度、强制展开下拉列表、实现自动查询功能、创建多列下拉框、应用XP风格以及添加图标到ComboBox。 1. 改变ComboBox下拉高度:默认情况下,...

    Ext4.0 动态修改ComboBox选择项(本地模式)

    首先,ComboBox在Ext JS中是一个可选列表的输入控件,它可以展示一个下拉菜单供用户选择。在本地模式下,ComboBox的数据通常存储在本地,如JavaScript数组中,而不是从远程服务器获取。这样可以提高应用的响应速度,...

Global site tag (gtag.js) - Google Analytics