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

  四、代码下载
/201006/yuanma/combox2010-6-12.rar
结束

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

(0)

相关推荐

  • js实现的全国省市二级联动下拉选择菜单完整实例

    本文实例讲述了js实现的全国省市二级联动下拉选择菜单.分享给大家供大家参考.具体如下: 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-province-city-cho-menu-codes/ 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-

  • js出生日期 年月日级联菜单示例代码

    现在世界通用的公历(阳历)也经过一个长期演变的过程.我们先看,公历每个月的日数是固定的:"七前单大,八后双大".也就是说,一.三.五.七.八.十.腊月(十二月)是31天,四.六.九.十一月是30天,只有二月,平年28天,闰年29天. 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits

  • js实现网页多级级联菜单代码

    本文实例讲述了js实现网页多级级联菜单.分享给大家供大家参考.具体如下: 这是大家在网页上经常会见到的级联菜单特效,不过这一个代码是由JS来实现,将级联菜单中的内容保存在了JS数组中,为了页面美观,本次还美化了一下表格边框,整体看上去更和谐实用了,多级的下拉菜单对网页设计来说比较实用. 运行效果如下图所示: 在线演示地址如下: http://demo.jb51.net/js/2015/js-table-select-menu-style-codes/ 具体代码如下: <!DOCTYPE HTML

  • js 使用form表单select类实现级联菜单效果

    用例如下: 复制代码 代码如下: <form name="form1" method="POST" action="--WEBBOT-SELF--"> <select id="select1" onchange="select1onchange()"> <option value="1">1</option> <option valu

  • JavaScript实现级联菜单的方法

    本文实例讲述了JavaScript实现级联菜单的方法.分享给大家供大家参考.具体实现方法如下: <html> <head> <title>test</title> <script type="text/javascript"> function f() { var sel=document.getElementById("country"); var sel2=document.getElementById

  • javascript实现二级级联菜单的简单制作

    本文实例讲述了javascript实现二级级联菜单的简单制作方法.分享给大家供大家参考.具体如下: 运行效果截图如下: 具体代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="pragma" content="

  • 用php+javascript实现二级级联菜单的制作

    大体思路是这样的:为了不让先前的页面刷新,我用iframe潜入了一个二级子页面,用来读取数据库中的数据,最后把想要的数据传递给父级页面,完成数据的选择和转移. 主要程序代码如下(部分代码有改动,但不影响功能): 父页面reg.html: <iframe src="city.php" width="300″ height="22″ frameborder="0″ scrolling="no"></iframe> &

  • 前台JS(jquery ajax)调用后台方法实现无刷新级联菜单示例

    前台用AJAX直接调用后台方法,老有人发帖提问,没事做个示例 CasMenu.aspx页面: 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="CasMenu.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr

  • Ajax+Json 级联菜单实现代码

    第一个下拉框: 复制代码 代码如下: <select id="select" name="rawfoodBasic.category" onchange="doChange(this.value);"> //第一个下拉框里的值 </select> 第二个下拉框: 复制代码 代码如下: <select id="subSelect" name="rawfoodBasic.absorb&quo

  • js实现城市级联菜单的2种方法

    本文实例为大家分享了js实现城市级联菜单的具体代码,供大家参考,具体内容如下 方法一:用switch方法判断. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script type="text/javascript"> function ch

随机推荐