EasyUi -- 如何根据动态加载panel和Datagrid

在做项目的过程中,前台的面板和表格一般都不是固定的,它是根据后台传来的数据进行变化的。举个例子:

实现:

看一下我们的效果图:

这个上面的最左边的Panel要根据系别动态加载,有多少个系别就要加载都少个Panel,Panel里面的是一个table,这个里面也是动态加载出来。

右边是一个datagrid,datagrid里面的工作效率、业务能力等等也都是数据库动态加载出来的,包括后面的ABCD也是动态的。

这样就算数据库中的数据怎么变,这里都会动态地加载出来。那么怎么实现这些功能呢?

一、动态加载Panel:

<span style="font-family:KaiTi_GB2312;font-size:18px;"> $.getJSON("/Evaluation/GetAllCrites", null, function (data) {
                for (var m = 0; m < data.SeriesValueSaveNum; m++) {
                    $("#panal").accordion('add', {
                        title: data.SeriesNameSave[m],
                        content: "<div style='text-align:center' id='tableDiv" + m + "'>" + ini(data, m) + "</div>"
                    });
                }</span>

第一行,其实是调用EvaluationController中的GetAllCrites函数,返回data就是从后台传来的数据了,这里用到的是panel的Add的属性,title和content就是panel的参数。

简单的写一下,就是这样的:

<span style="font-family:KaiTi_GB2312;font-size:18px;">for (var m = 0; m < 3; m++) {
                    $("#panal").accordion('add', {
                        title: "panel的标题",
                        content: "panel的内容!"
                    });
                }</span>

这样是不是就很简单了。

二、动态加载table中的数据

table其实就是用来规定格式,我们可以在table里面放各种的控件或者数据。这里的代码实现是:

<span style="font-family:KaiTi_GB2312;font-size:18px;">        function ini(data, num) {
            var maxCol = 0;
            //var strTbody = ["<table>"];
            var strTbody = ["<table width='210px'>"];
            strTbody += "<tr>";
            for (var i = 0; i < data.StaffNameSave[num].length; i++) {
                strTbody += "<td><input name='mychk' type='checkbox' id='" + data.StaffIDSave[num][i] + "' onclick='onMyChk(this);' value='" + data.StaffNameSave[num][i] + "' />" + data.StaffNameSave[num][i] + "</td>";
                maxCol++;
                if (maxCol % 3 == 0) {
                    strTbody += "</tr>";
                    strTbody += "<tr>";
                }
            }
            strTbody += "</tr>";
            strTbody += "</table>";
            return strTbody;
        }</span>

当然这里面我也用到了拼接字符串,这里直接return strTbody到上面panel里面是最上面的效果了。

三、动态加载datagrid的列数和列数据

<span style="font-family:KaiTi_GB2312;font-size:18px;"> function getjson() {
            $.getJSON('/Evaluation/QueryAssessProgram', null, function (data) {
                $.getJSON('/Evaluation/QueryScores', null, function (scores) {
                    var columns = new Array();

                    var products = new Array();
                    //var titles = [];
                    for (var n = 0; n < scores.num; n++) {
                        var product = { productid: scores.scorevalue[n], name: scores.score[n] };
                        products.push(product);
                    };

                    for (var i = 0; i < data.headersnum; i++) {

                        //传值,将考核项的名称以数组的形式传递
                        //proheadername.push(data.headersName[i]);
                        //拼接字符串,出现ABCD的效果
                        var titles = [];
                        for (var j = 0; j < scores.num; j++) {
                            var title = '<a href="#" onclick="addscore(' + "'" + scores.score[j] + "'" + ',' + "'" + data.headersName[i] + "'" + ',' + "'" + scores.scorevalue[j] + "'" + ')">' + scores.score[j] + '   </a>';
                            titles += title;
                        }
                        var column = {
                            field: data.headersName[i], title: data.headersName[i] + titles, width: 100, formatter: function (value) { for (var i = 0; i < products.length; i++) { if (products[i].productid == value) return products[i].name; } return value; }, editor: { type: 'combobox', options: { valueField: 'name', textField: 'name', data: products, required: true } }
                        }
                        columns.push(column);
                    }

                    var column1 = { field: 'TotalScores', title: '总分', width: 50 }
                    columns.push(column1);
                    var column2 = { field: 'action', title: '修改', width: 70, align: 'center', formatter: function (value, row, index) { if (row.editing) { var s = '<a href="#" onclick="saverow(this)"><img src="../../EasyuiSource/themes/icons/filesave.png" border="0">保存</a> '; var c = '<a href="#" onclick="cancelrow(this)"><img src="../../EasyuiSource/themes/icons/cancel.png" border="0">取消</a>'; return s + c; } else { var e = '<a href="#" id="deitcls" onclick="editrow(this)"><img src="../../EasyuiSource/themes/icons/pencil.png" border="0">修改</a> '; return e; } } }
                    columns.push(column2);

                    initTable(columns);

                })
            })
        }</span>

这样我们就可以调用inittabe这个函数讲我们写好了的列的属性放在datagrid里面了:

<span style="font-family:KaiTi_GB2312;font-size:18px;">  function initTable(columns) {
            $('#dg').datagrid({
                title: '评分',
                //url: '/Division/QueryBy',
                url: '',
                width: '740',
                rownumbers: true,
                frozenColumns: [[
                {
                    field: 'checked', formatter: function (value, row, index) {
                        if (row.checked) {
                            return '<input type="checkbox" name="DataGridCheckbox" checked="checked">';
                        }
                        else {
                            return '<input type="checkbox" name="DataGridCheckbox">';
                        }
                    }, width: 25
                },

                { field: 'Name', title: '姓名', width: 80 },
                { field: 'ID', title: 'productname', hidden: 'true' }
                ]], columns: [
                    columns
                ],
                onBeforeEdit: function (index, row) {
                    row.editing = true;
                    updateActions(index);
                },
                onAfterEdit: function (index, row) {
                    row.editing = false;
                    updateActions(index);
                },
                onCancelEdit: function (index, row) {
                    row.editing = false;
                    updateActions(index);
                }
                //singleSelect: true,
            });
        }</span>

这里要记住一点就是我们都要知道columns这个参数其实Array,它自己带的"[]",我第一开始就加了"[]",结果吃亏了,哈哈哈,很痛的领悟。

总结:

我们在设计前台的时候就一定要想到,自己做的界面是不是可以满足各种各样的要求,我们想得越多,这样我们的软件存活的时间就越长!

时间: 2024-08-06 16:01:05

EasyUi -- 如何根据动态加载panel和Datagrid的相关文章

如何用easyui动态加载表格标题

在最近做的项目中涉及到了需要加载大量表格的功能,采用了easyui的datagrid,但是发现datdagrid表格标题需要手动写,这在表格多的情况是一件很麻烦的事情.经过了long long time 终于研究出来了动态加载表格标题的方法. 首先给下效果图. 刚开始本人用easyui最原始的方式将表格放入我需要它放置的位置.整体页面因为某些原因呢就不展示给大家看了. 首先大家可以去网上下载easyui的包以及easyui的中文文档.easyui包友情链接:http://www.jeasyui.

Windows.Forms Panel 动态加载用户控件 UserControl

创建好一个Windows Forms程序,在创建好的程序中Form1添加一个Panel控件 如图: 然后再程序中添加一个用户控件 添加好以后再目录看见 就是创建好了,然后在用户控件随便拉几个按钮(为了主函数加载的时候显示效果) 然后再主函数的 Form1_Load 先在命名空间加上 :using UserControlTest.Controel.tabControel; 在New一个用户控件的类, private void Form1_Load(object sender, EventArgs

EasyUI的treegrid组件动态加载数据问题的解决办法

http://www.jquerycn.cn/a_3455 —————————————————————————————————————————————————————————————————————————————————————— 最近涉及到treegrid组件的查询,需要根据查询条件动态更新EasyUI的treegrid组件的动态加载查询结果 搜遍了treegrid源码和文档发现treegrid是扩展自datagrid和tree的,不过以往利用datagrid的reload方法加参数的 方式

jquery easyui datagrid 动态 加载列

实现方式: 首先根据输入的sql语句获得相关的列名称返回给前台,然后在datagrid中动态加载列,接着根据查询条件(包括sql语句)获取相关的记录返回给前台用于填充datagrid.从而实现类似oracle web版的sql查询. 前台主要js为: Js代码   function sqlSearch(){ var sqlStatement = $.trim($("#sqlStatementId").val()); if(sqlStatement == null || sqlState

【EasyUi DataGrid】动态加载列

动态加载列可以说是一个从无到有的过程,如果只是网页上的DataGrid实现那就太无味了,有趣的在这里,这个页面上连带着一大堆的数据库表的查询修改,尤其是做着做着发现数据表设计有缺陷,需要的数据竟然只有出口没有入口,想想也是醉了,对业务不熟悉真心的杀不起啊.这个其实蛮好玩的,就像玩捉迷藏藏得那个人叫做nothing,再后来我又遇到了Multiple-births(多胞胎),一个页面上涉及到了六七张数据库表,里边的字段名虽然不一样,可它就是达到了百分之七八十的相似度,多亏咱是上过学的,欺负不了我读书

黄聪:AngularJS 动态加载控制器实例-ocLoazLazy

一.AngularJS动态加载控制器和视图实例 路由配置关键代码: [javascript] view plain copy print? //二级页面 $stateProvider.state('main', { url: '/:name', /**如果需要动态加载数据和控制器***/ views: { "": { templateUrl: function ($stateParams) { console.info($stateParams); return '/template/

动态加载和动态注册类技术的深入探索

Delphi的包是Delphi IDE的核心技术,没有包也就没有了Delphi的可视化编程.包也可以用在我们开发的项目中,其好处是可以代码共享,减小工程尺寸,单纯通过替换包文件就能实现工程的升级和补丁.但是我们要加载包,就要知道包中已经存在的类.关于如何动态加载包的资料比比皆是我就不想就此问题讨论了.但是Delphi的IDE很是特殊,它无需事先知道你的包有哪些类就能注册组建,创建组建.但是Borland没有公开BPL文件的格式.我们自己是否可以实现IDE的功能呢?首先我们知道.一个组件包想要能在

ExtJS4.2 仅需配置URL动态加载GridPanel列(带分页)

最近做ExtJS一直想做个傻瓜式的GridPanel,今天折腾了一天,从GitHub找到的老外写的解决方案, 在他的基础上做了一些改动,增加了分页,增加了columns手动配置(原本只能动态生成),大家有兴趣可以自由扩展,我做了很详细的注释 效果图如下,仅需在html页面引入ext.all,并创建自定义控件,配置url即可创建带分页效果的GirdPanel 代码: 效果图: 一.动态加载自定义控件 自定义脚本包括两部分:DynamicGrid.js和DynamicReader.js 将Ext目录

js的动态加载、缓存、更新以及复用(二)

上一篇发出来后得到了很多回复,在此首先感谢大家的热情捧场!有的推荐第三方框架,比如 In.js.requrieJS.sea.js.lab.js等.这个开阔了眼界,以前只知道sea.js,省去了自己搜索的麻烦.也用了点时间简单看了一下,因为每一个都是大块头,都有自己的理念,如果只是简单使用的话,那么谁便找一个就可以了,但是我习惯把原理弄清楚.因为我觉得虽然不知道原理也可以使用,但是知道了原理后,可以用的更好. 主要看的是sea.js,目前简单的理解是:一个加载js的机制 + 模块化编程(CMD规范