[ExtJS]设置级联菜单的默认值

前言

   ExtJS在修改这样的页面上赋值是很方便的,在正文中1.2.1代码中可以看出,一行代码就可以搞定,但这是对于普通控件而言,如文本框。对于ComboBox可没这么简单...

 

版本

  Ext JS Library 3.0.0

 

正文

  一、问题

    1.1  截图

       

    1.2  代码

      1.2.1  前端代码

    <script type="text/javascript">
        //
        function ExtStore(url)
        {
            return new Ext.data.Store({
                proxy: new Ext.data.HttpProxy({
                    url: url
                }),
                reader: new Ext.data.JsonReader({
                    totalProperty: 'count',
                    root: 'result'
                },
                [
                    { name: 'Id' },
                    { name: 'Name' }
                ])
            });
        }
        
        Ext.onReady(function() {
            Ext.QuickTips.init();
            Ext.form.Field.prototype.msgTarget = 'side';
            
            var store1 = ExtStore('combox.aspx?method=GetProvinces');
            var store2 = ExtStore('combox.aspx?method=GetCitys');
            
            var combo2 = ComboBox('combo2','二级菜单',store2);
            var combo1 = new Ext.form.ComboBox({
                mode: 'remote',
                fieldLabel:'一级菜单',
                name:'combo1',
                editable : false,
                typeAhead: true,
                triggerAction: 'all',
                displayField:'Name',
                valueField:'Id',
                selectOnFocus:true,
                store:store1,
                listeners: {
                    'select': function(combo, record){
                        var id = record.get('Id');
                        if(id)
                        {
                            //清空二级菜单选项
                            combo2.setRawValue('');
                            store2.proxy = new Ext.data.HttpProxy({
                                url:String.format('combox.aspx?method=GetCitys&Province={0}',id)
                            });
                            store2.load();
                        }
                    }
                }
            });
            
            var form1 = new Ext.FormPanel({
                layout: 'form',
                autoHeight: true,
                frame: true,
                renderTo: Ext.getBody(),
                title: '<center style="curor:hand" onclick="window.location.reload();">表单控件</center>',
                style: 'margin-left:auto;margin-right:auto;width:500px;margin-top:8px;',
                //设置标签对齐方式
                labelAlign: 'right',
                //设置标签宽
                labelWidth: 170,
                //设置按钮的对齐方式
                buttonAlign:'center',
                //默认元素属性设置
                defaults:{  width:180   },
                items: [
                    combo1,
                    combo2
                ]
            });
            
            //加载数据
            Ext.Ajax.request({
                url: 'combox.aspx?method=Detail',
                method: 'GET',
                callback: function (options, success, response) {
                    if(success && response.status == 200){
                        //将值批量赋值
                        form1.form.setValues(Ext.util.JSON.decode(response.responseText))
                    }
                }
            }); 
        });
    </script>

      1.2.2  后台代码

    static IList<Combox> Provinces = new List<Combox>();
    static IDictionary<int, Combox> Citys = new Dictionary<int, Combox>();

    static combox()
    {
        Provinces.Add(new Combox() { Id = 1, Name = "湖南省" });
        Provinces.Add(new Combox() { Id = 2, Name = "广东省" });

        Citys.Add(1, new Combox()
        {
            Id = 1,
            Name = "长沙市"
        });

        Citys.Add(2, new Combox()
        {
            Id = 1,
            Name = "岳阳市"
        });

        Citys.Add(3, new Combox()
        {
            Id = 2,
            Name = "深圳市"
        });

        Citys.Add(4, new Combox()
        {
            Id = 2,
            Name = "珠海市"
        });
    }

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    /// <summary>
    /// 获取所有省份数据
    /// </summary>
    /// <returns></returns>
    public void GetProvinces()
    {
        Response.Write(new StringBuilder().Append("{count:")
            .Append(Provinces.Count)
            .Append(",result:")
            .Append(JavaScriptConvert.SerializeObject(Provinces))
            .Append('}')
            .ToString());
    }

    /// <summary>
    /// 获取省下面的市区数据
    /// </summary>
    /// <returns></returns>
    public void GetCitys()
    {
        IList<Combox> result = new List<Combox>();
        int Province = Convert.ToInt32(Request.QueryString["Province"]);
        foreach (KeyValuePair<int, Combox> data in Citys)
        {
            if (data.Value.Id == Province)
                result.Add(new Combox() { Id = data.Key, Name = data.Value.Name });

        }
        Response.Write(new StringBuilder().Append("{count:")
            .Append(result.Count)
            .Append(",result:")
            .Append(JavaScriptConvert.SerializeObject(result))
            .Append('}')
            .ToString());
    }

    public override string Detail()
    {
        IDictionary<string, int> result = new Dictionary<string, int>();
        result.Add("combo1", 2);
        result.Add("combo2", 2);
        return JavaScriptConvert.SerializeObject(result);
    }

    class Combox
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    1.3  代码说明

      1.3.1  后台代码中使用的数据仅用测试用

      1.3.2  意图:加载的时候就默认选择广东省——珠海市

 

  二、问题分析 

    ComboBox延迟加载导致。

 

  三、解决办法

    2.1  让ComboBox赋值后显示对应的Name,而不是Id

      在Ext.Ajax.request执行前加一句“store1.load();”即可。

       

    2.2  ComboBox级联赋值

      级联赋值可没这么简单了,需要手动触发事件,这里尝试了很长时间才出结果。

      2.2.1  第一步,手动触发一级菜单选择事件

            store1.load();
            
            //加载数据
            Ext.Ajax.request({
                url: 'combox.aspx?method=Detail',
                method: 'GET',
                callback: function (options, success, response) {
                    if(success && response.status == 200){
                        //将值批量赋值
                        form1.form.setValues(Ext.util.JSON.decode(response.responseText))
                        
                        var comboValue1 = combo1.getValue();
                        var selectRecord;
                        store1.each(function(record){
                            if(record.data.Id == comboValue1)
                                selectRecord = record;
                        });
                        combo1.fireEvent('select',combo1,selectRecord);
                    }
                }
            }); 

        这里发现手动触发得自己传入record的参数,不然里面去不到值。

      2.2.2  修改级联

                            store2.load({
                                callback :function(r,options,success){
                                    if(success){
                                        if(IsLoad)
                                        {
                                            combo2.setValue(comboValue2);
                                            IsLoad = false;
                                        }
                                    }
                                }
                            });

        代码说明:

          a).  IsLoad是全局变量,用来控制仅设置一次默认值

          b).  很容易又会犯触发菜单一就直接给菜单二赋值的错,注意这里因为菜单二还没有加载完,所有如果直接在触发事件后面写赋值,出来仍然是数字。

      2.2.3  最终效果图

        

 

  四、代码下载

    /Files/over140/2010/6/combox2010-6-12.rar

 

  五、维护

    5.1  2010-6-13

      此文对本文的问题有所启发:http://hi.baidu.com/pure_adoration/blog/item/7146f0264608730a908f9d5d.html

 

  六、转载保留

    博客园:http://www.cnblogs.com/

      农民伯伯:http://over140.cnblogs.com/

 

结束

  注意代码中的如PageBase、 ComboBox('combo2','二 级菜单',store2)之类的代码可以在我以前的文章里面找得到说明。遇到问题除了抱怨还可以选择消灭,那种解决后的快感是非常深刻的,这个问题很早就解决了,一直没时间写,现在仍然记得清晰 :)

转载:http://www.cnblogs.com/over140/archive/2010/06/12/1757235.html

时间: 2024-08-06 23:34:42

[ExtJS]设置级联菜单的默认值的相关文章

ExtJS 设置级联菜单的默认值_extjs

前言 ExtJS在修改这样的页面上赋值是很方便的,在正文中1.2.1代码中可以看出,一行代码就可以搞定,但这是对于普通控件而言,如文本框.对于ComboBox可没这么简单... 版本 Ext JS Library 3.0.0 正文 一.问题 1.1 截图 1.2 代码 1.2.1 前端代码 复制代码 代码如下: <script type="text/javascript"> // function ExtStore(url) { return new Ext.data.St

MySQL datetime数据类型设置当前时间为默认值

环境:MySQL Sever 5.1 + MySQL命令行工具 问题:MySQL datetime数据类型设置当前时间为默认 值 解决: 方法一: 由于MySQL目前字段的默认值不支持函数,所以以create_time datetime default now() 的形式设置默认值是不可能的.代替的方案是使用TIMESTAMP类型代替DATETIME类 型. TIMESTAMP列类型自动地用当前的日期和时间标记INSERT或UPDATE的操作.如果有多个 TIMESTAMP列,只有第一个自动更新

easy ui 如何设置下拉框 默认值的颜色

问题描述 easy ui 如何设置下拉框 默认值的颜色 下拉列表的数据:请输入** ,"请输入 "设置为灰色,但下拉列表的数据显示为黑色字体颜色 如何做?求大神指点 解决方案 div默认的下拉而已,获取第一个项目设置为灰色就行了 $('#cb').combobox('panel').find('div:first').css('color','#999')

MySQL设置当前时间为默认值方法

代替的方案是使用TIMESTAMP类型代替DATETIME类型. CURRENT_TIMESTAMP :当我更新这条记录的时候,这条记录的这个字段不会改变. CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP :当我更新这条记录的时候,这条记录的这个字段将会改变.即时间变为了更新时候的时间. (注意一个UPDATE设置一个列为它已经有的值,这将不引起TIMESTAMP列被更新,因为如果你设置一个列为它当前的值,MySQL为了效率而忽略更改.)如果有多个TI

在WPS演示2013中设置新对象的默认值

  ①首先我们启动WPS演示2013,单击菜单栏--插入--形状,选择一款图形插入. ②右击图形,选择设置对象格式. ③设置线条以及填充色,最后勾选新对象默认值,切记一定要勾选此项. ④确定之后,重新插入形状,可以看到新插入的形状图形样式颜色都跟刚才设置的一样.

ExtJS4给Combobox设置列表中的默认值示例_extjs

这个是model 复制代码 代码如下: Ext.regModel('commemModel', { fields : [ 'name', 'id' ] }); 定义一个store设置id为s1的容器的默认值是 第一季度 复制代码 代码如下: var gjcx1 = new Ext.data.Store({ autoLoad:true, model : commemModel, proxy : { type : 'ajax', url : '../store/cxjd.json' }, liste

操作系统常见问题:一些建议更改的Windows系统默认值

刚安装完毕时的 Windows 的一些默认值,我个人认为并不好用,所以提出几个建议你改变的地方,让工作更顺利. 然而,维持原状好用.还是更改后好用,这是很主观的.对我而言,我211.html">觉得做这样的变更,会让操作更顺手,但是说不定,你却不习惯这样的变更,所以,请你依照你的习惯,来看看哪些地方需要改.或保持你的现状. 下面的这些方法,都适用于 http://www.aliyun.com/zixun/aggregation/13559.html">Windows 98.

控件的默认值、控件属性

问题描述 (1)PreInit:  1.检查IsPostBack 属性  2.动态设置Master Page  3.动态设置Theme  4.设置控件的默认值(UniqueId等)  5.重新创建动态控件(初始化控件),初始化控件的值  (2)Init: 这个事件发生在所有的控件被初始化,所有的皮肤设置被应用以后.它用来读取或者初始化控件属性.它能够用来注册一些aspx页面中没有指出的控件的事件----------------------------------标红部分的"控件的默认值"

联想打印机如何恢复默认值(LJ2205、LJ2206、LJ2206w)

故障现象: LJ2205.LJ2206.LJ2206w如何恢复默认值? 解决方案: 出厂设置-将设备的部分设置恢复为默认值: 1.关闭设备电源: 2.确保已合上顶盖且插入电源线插头: 3.按住电源键,同时打开再合上顶盖: 4.松开电源键,确保所有指示灯全部熄灭: 5.连续按电源键八次,确保所有指示灯全部亮起,表示设备已经恢复为出厂默认值,设备将重启,完成出厂设置. 设置重置-将设备的所有设置恢复为出厂默认值: 1.关闭设备电源: 2.确保已合上顶盖且已插入电源线插头: 3.按住电源键,同时打开再