dojo:如何为表格添加从数据库获得存储的下拉框

为表格添加下拉框的例子官网上就有,但如果下拉框的数据是从数据库请求的。需要有一些注意的地方。

首先希望实现的效果如下图所示:

表格初始数据为空,点击查询后获得表格表格数据,但下拉框的数据是在对应的formatter函数中单独向服务器中请求的。

大概的步骤如下:

1.初始化表格

                    gridLayout =[{
                        defaultCell: {  type: cells._Widget, styles: ‘text-align: center;‘  },
                        cells: [
                                    { name: "WBS", field: "wbsCode", width: "40px"},
                                    { name:"配置名称",field:"configName",width:"80px"},
                                    { name:"设备名称", field: "equipName", width: "80px" },
                                    { name:"维修项目号", field: "mopNo", width: "60px" },
                                    { name:"维修项目名称", field: "mopName", width: "60px" },
                                    { name:"周期", field: "mlpCode", width: "40px" },
                                    { name:"负责人", field: "personName", width: "80px", formatter: formatterPersonCombobox},
                                    { name:"计划时间", field: "planDate", width: "80px" },
                                    { name:"备件/工具紧缺报警", field: "planDate", width: "80px" }
                                ]
                        }];    

                    storeGrid=new Memory();
                    dataStoreGrid=new ObjectStore({objectStore : storeGrid});
                    grid = new EnhancedGrid({
                        structure: gridLayout,
                        store: dataStoreGrid,
                        "class": "grid",
                        escapeHTMLInData: false,
                        noDataMessage: "没有维修项目数据"    ,
                        plugins: {indirectSelection: {headerSelector:true, field: "isChecked",width:"40px", styles:"text-align: center;"}}
                     }, "gridDiv"
                    );
                    grid.startup(); 

2.填写下拉框对应的formatter函数

                    //创建表格中负责人对应的下拉框的函数
                    function formatterPersonCombobox() {
                        var    personId="";
                        var selectPerson=new ComboBox({
                            label: "Combo",
                               style: "width: 80px;",
                               placeHolder: "请选择...",
                               searchAttr: "name"    //这个属性不能少
                           });
                        request.get("utilSelectGetJsonAction.action?mode=comboBox&utilSelect.selectName=personSelect",{handleAs : "json"})
                              .then(function(data){
                                   //返回的数据在data中,为数组对象形式
                               var storePerson = new Memory({data : data  });
                               selectPerson.store=storePerson;//不能是Object类型的Store,好奇怪
                               selectPerson.startup();
                           });
                        selectPerson._destroyOnRemove = true;
                        return selectPerson;
                    }    

这里需要说明的是request函数请求获得data后,在其对应的then方法里的代码实际上是最后执行的,即selectPerson.startup();是在return selectPerson;后执行的。

这就导致了不能将Combobox的初始化工作放在then里面写,即不能写成这样的代码

            function formatterPersonCombobox() {
                        var    personId="";
                        request.get("utilSelectGetJsonAction.action?mode=comboBox&utilSelect.selectName=personSelect",{handleAs : "json"})
                              .then(function(data){
                                   //返回的数据在data中,为数组对象形式
                               var storePerson = new Memory({data : data  });
                               var selectPerson=new ComboBox({
                                    label: "Combo",
                                       style: "width: 80px;",
                                       placeHolder: "请选择...",
                                       store:storePerson,
                                       searchAttr: "name"    //这个属性不能少

                                   });
                           });
                        selectPerson._destroyOnRemove = true;
                        return selectPerson;
                    }    

上面的代码会导致在Combobox被初始化之前就实际返回了selectPerson,从而发生错误。

现在还有一个问题就是所有的Combobox实际上请求的是同一数据源,如果是多条记录,则向服务器发出了多个没必要的get请求,这有待解决。

解决的办法是这样的,因为表格的数据是通过点击查询按钮才获得的。

所以可以在页面第一次加载时就请求下拉框对应的数据源

       //初始化负责人下拉框对应的数据源,即先服务器发出请求,存储在storePerson中,在随后的formatter中直接调用
                    var storePerson=new Memory({});
                    request.get("utilSelectGetJsonAction.action?mode=comboBox&utilSelect.selectName=personSelect",{handleAs : "json"})
                              .then(function(data){
                                  storePerson = new Memory({data : data  });
                              });    

随后在formatter函数中直接调用即可,因为formatter函数需要点击查询按钮才会执行,所以它会在storePerson = new Memory({data : data });  之后才执行:

                    //创建表格中负责人对应的下拉框的函数
                    function formatterPersonCombobox() {
                        var    personId="";
                        var selectPerson=new ComboBox({
                            label: "Combo",
                               style: "width: 80px;",
                               placeHolder: "请选择...",
                               store:storePerson,
                               searchAttr: "name"    //这个属性不能少
                           });
                        selectPerson._destroyOnRemove = true;
                        return selectPerson;
                    }
时间: 2024-09-29 20:52:29

dojo:如何为表格添加从数据库获得存储的下拉框的相关文章

javascript 可多选的下拉框 multiselect 动态删除option值,动态添加option值,动态生成表格

首先引用一个写的很好的博客http://www.cnblogs.com/landeanfen/p/5013452.html 我使用的是bootstrap-multiselect,实现功能是 选择下拉框中的某几项数据后,通过点击add按键,可以将数据动态的添加到一个table中: 移除掉下拉框中的这几项: 删除table中的某行数据,对应的下拉框中会再添加这些值. bootstrap-multiselect源码主页:https://github.com/davidstutz/bootstrap-m

Web 1三级联动 下拉框 2添加修改删除 弹框

Web  三级联动 下拉框 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class _Default : System.Web.UI.Page { private MyDBDataContext _Context = new MyDBD

easyUI中select下拉框添加option选项

使用jquery easyui的下拉列表combobox碰上问题,下拉列表的项都是从 数据库读出来的,然后我想在动态生成的项中添加一项:"<option value=''>=全部=</option>". 但怎么也添加不成功. 首先试了直接用jquery对该下拉列表进行添加操作: JavaScript code ? 1 2 3 4 5 6 7 8 $('#selUnin').combobox({         url: _callback_url + '&

jqgrid 表格中筛选条件的多选下拉,树形下拉 ;文本框清除插件;高级查询多条件动态筛选插件

/** * @@desc 文本框清除按钮,如果isAutoWrap为false当前文本框父级必须是relative定位,boostrap参考input-group * @@author bear.LEE <571115139#qq.com> * @@since 2018-08-21 **/ ; (function ($) { $.fn.extend({ addClearBtn: function (options, $o) { var deft = { symbolClass: "f

第二百二十四节,jQuery EasyUI,ComboGrid(数据表格下拉框)组件

jQuery EasyUI,ComboGrid(数据表格下拉框)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解 EasyUI 中 ComboGrid(数据表格下拉框)组件的使用方法,这个组件 依赖于 Combo(自定义下拉框)和 DataGrid(数据表格)组件. 一.加载方式 class 加载方式 <select id="box" class="easyui-combogrid" name="dept" sty

GridView列添加下拉框,绑定数据源并设置默认值

添加下拉框:   注意:默认值只能在界面初始化直接中设置 DataGridViewComboBoxColumn dataGridViewComboBoxColumn = new DataGridViewComboBoxColumn(); dataGridViewComboBoxColumn.Name = "dgvcbcSeatType"; dataGridViewComboBoxColumn.DataPropertyName = "SeatType"; dataGr

动态加载下拉框列表并添加onclick事件

1.  js动态加载元素并设置属性 摘自(http://www.liangshunet.com/ca/201408/336848696.htm) <div id="parent"></div> function addElementDiv(obj) { var parent = document.getElementById(obj); //添加 div var div = document.createElement("div"); //设

通过jquery来实现文本框和下拉框动态添加效果,能根据自己的需求来自定义最多允许添加数量,实用的jquery动态添加文本框特效

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-

asp.net mvc中 下拉框联动效果 添加方法

首页查询第一级菜单的所有集合List,取到第一级的第一个下标,根据第一个下标查询第二级集合. 这样在页面就显示了 两个下拉select菜单,默认是从数据库查询的是第一个. 根据下拉框选择相应的第二级数据,在页面上面需要写一个ajax提交方法, $(function () { $('#sltCampus').on('change', function() { $.ajax({ type: "POST", url: '/Member/GetRestaurant', data: { camp