asp.net mvc jqgrid 同一个页面查询不同的表,jqgrid显示不同表的表头和数据并且分页

基于我上一篇文章<a href="http://www.cnblogs.com/alasai/p/4765756.html">asp.net mvc excel导入</a>中不同的部门上传不同的excel文件类型,当在同一个页面查询时怎么办呢。

解决方案:根据传过来的表名和时间参数一次性把数据全部加载到table中,其中表头要我们一个个去定,主体的顺序我们也要和表头一样,加载到前台再用表格分页控件来分页,我这里大概有100多个excel文件类型,他们的列名都不要,想想这样的做法不且实际。

有没有其他的解决方案呢,看了很多的jqgrid示例,他们的表头(colNames)和内容(colModel)都是首先定死的。这里我想到一个解决方案就是把colNames和colModel都做成活的,这样不就可以完美解决上面的问题了吗,

想法总是好的,但做起来不是一帆风顺的,但前提是你得有这种想法才行。

想法和思路:

1.把jqgrid的colNames和colModel都做成活的,但是每个表的colNames都不一样,而且他们的顺序必须一致才行,怎么办呢,在<a href="http://www.cnblogs.com/alasai/p/4765756.html">asp.net mvc excel导入</a>这篇文章中我上传文件成功之后会把他们的colNames和colModel都保存在以他们表名命名的txt文件中。代码片段如下

所以展示每个表的colNames和colModel就不成问题

后台c#代码如下:

 [HttpPost]
        public ActionResult GetTestData(string department, string tablename, string StartTime, string EndTime)
        {
            Stopwatch watch = CommonHelper.TimerStart();
            string sql5 = "SELECT * FROM " + department + "_" + tablename + " where 1=1 and enabled=‘1‘ ";
            if (!string.IsNullOrEmpty(StartTime))
            {
                sql5 += " and convert(varchar(10),addtime,120)>=‘" + StartTime + "‘ ";
            }
            if (!string.IsNullOrEmpty(EndTime))
            {
                sql5 += " and convert(varchar(10),addtime,120)<=‘" + EndTime + "‘ ";
            }
            DataTable ListData = DataFactory.Database().FindTableBySql(sql5);
            this.dirCSV = Server.MapPath("~/Content/uploads/");
            StreamReader sr = new StreamReader(this.dirCSV + "\\" + department + "_" + tablename + ".txt");
            String line;
            List<string> list = new List<string>();
            while ((line = sr.ReadLine()) != null)
            {
                list.Add(line.ToString());
            }
            string colnames = "";
            string[] chinesname = list[0].ToString().Trim(‘,‘).Split(‘,‘);
            string[] englishname = list[1].ToString().Trim(‘,‘).Split(‘,‘);
            for (int i = 0; i < chinesname.Length; i++)
            {
                colnames += "‘" + chinesname[i].ToString() + "‘,";
            }
            List<Department> list1 = new List<Department>();
            for (int j = 0; j < englishname.Length; j++)
            {
                list1.Add(new Department { index = englishname[j].ToString().ToLower(), lable = chinesname[j].ToString(), name = englishname[j].ToString().ToLower(), sortable = "false" });
            }
            var result = new
            {
                Json = new
                {
                    colNames = chinesname,
                    colModels = (from dept in list1
                                 select new
                                 {
                                     index = dept.index,
                                     lable = dept.lable,
                                     name = dept.name,
                                     sortable = false
                                 }),
                    data = new
                    {
                        options = new
                        {
                            page = "1",
                            total = "1",
                            records = "1",
                            costtime = CommonHelper.TimerEnd(watch),
                            rows = ListData
                        }
                    }
                }
            };
            return Content(result.ToJson());
        }

那么前台改如何解析上面生成的json呢。

jquery代码如下

 $.ajax({
            url: "@Url.Content("/DataSwitch/GetTestData")?department=" + $("#seldepartment").val() + "&tablename=" + $("#ExcelFileId").val() + "&sjs=" + new Date().getTime() + "&StartTime=" + $("#StartTime").val() + "&EndTime=" + $("#EndTime").val(),
            type: ‘POST‘,
            cache: false,
            data: {},
            success: function (result) {
                result = eval(‘(‘+result+‘)‘);
                var colModels = result.Json.colModels;
                var colNames = result.Json.colNames;
                var data = result.Json.data.options;
                $("#gridTable").jqGrid({
                    datatype: ‘jsonstring‘,
                    datastr: data,
                    colNames: colNames,
                    colModel: colModels,
                    jsonReader: {
                        root: ‘rows‘,
                        repeatitems: false
                    },
                    gridview: true,
                    pager: $(‘#gridPager‘),
                    height: $(window).height() - 111,
                    autowidth: true,
                    rowNum: 15,
                    rowList: [15, 30, 50, 100],
                    viewrecords: true,
                    rownumbers: true,
                    shrinkToFit: false
                })
            },
            error: function (result) {

            }
        }); //end ajax

现在查询不同的表可以显示在jqgrid中显示不同的表内容了,但是这里又出现了一个问题(这个问题你是在百度上很难找得到解决方案的)

问题就是只能显示第一次选择的表内容,而且分页也没有效果,这个问题困扰了我三个小时,最后在jqgrid群里问了一下,有人说是加载之后,加载数据的html没有了。这时我就试试了再加载不同表格之前我重新构造一下html。

  $grid = $("<table id=‘gridTable‘></table><div id=‘gridPager‘></div>");
    $(‘#grid_List‘).empty().html($grid);

这时这段简短而神奇的代码解决了上面遇到的问题。

完整的jquery代码如下

 //加载表格
    function GetGrid() {
        var eid = $("#ExcelFileId").val();
        if (eid == "")
        {
            tipDialog("请先选择文件类型", 3,0);
            return false;
        }
        $grid = $("<table id=‘gridTable‘></table><div id=‘gridPager‘></div>");
        $(‘#grid_List‘).empty().html($grid);

        $.ajax({
            url: "@Url.Content("/DataSwitch/GetTestData")?department=" + $("#seldepartment").val() + "&tablename=" + $("#ExcelFileId").val() + "&sjs=" + new Date().getTime() + "&StartTime=" + $("#StartTime").val() + "&EndTime=" + $("#EndTime").val(),
            type: ‘POST‘,
            cache: false,
            data: {},
            success: function (result) {
                result = eval(‘(‘+result+‘)‘);
                var colModels = result.Json.colModels;
                var colNames = result.Json.colNames;
                var data = result.Json.data.options;
                $("#gridTable").jqGrid({
                    datatype: ‘jsonstring‘,
                    datastr: data,
                    colNames: colNames,
                    colModel: colModels,
                    jsonReader: {
                        root: ‘rows‘,
                        repeatitems: false
                    },
                    gridview: true,
                    pager: $(‘#gridPager‘),
                    height: $(window).height() - 111,
                    autowidth: true,
                    rowNum: 15,
                    rowList: [15, 30, 50, 100],
                    viewrecords: true,
                    rownumbers: true,
                    shrinkToFit: false
                })
            },
            error: function (result) {

            }
        }); //end ajax
    }

至此问题就被完美的解决了。

时间: 2024-09-29 02:18:01

asp.net mvc jqgrid 同一个页面查询不同的表,jqgrid显示不同表的表头和数据并且分页的相关文章

七天学会ASP.NET MVC (五)——Layout页面使用和用户角色管理

注:本文为学习摘录,原文地址为:http://www.cnblogs.com/powertoolsteam/p/MVC_five.html 目录 实验22——添加页脚 实验23——实现用户角色管理 实验24——实现项目外观一致性 实验25——使用Action  过滤器让页眉和页脚代码更有效 总结 实验22——添加页脚 在本实验中,我们会在Employee 页面添加页脚,通过本实验理解分部视图. 什么是“分部视图”? 从逻辑上看,分部视图是一种可重用的视图,不会直接显示,包含于其他视图中,作为其视

ASP.NET MVC 3 使用页面缓存 OutputCache 需要注意的问题

项目使用MVC3框架,页面使用缓存来缓解服务器压力,使用缓存配置文件设置CacheProfile <system.web> ...........<!--其他配置节点--> <caching> <outputCacheSettings> <outputCacheProfiles> <add name="index" duration="20" enabled="true" loca

ASP.NET MVC 自定义错误页面心得

自定义错误页面的目的,就是为了能让程序在出现错误/异常的时候,能够有较好的显示体验. 所以,首先要先了解,我们可以在哪里捕获异常. 当程序发生错误的时候,我们可以在两个地方捕获: Global里面的Application_Error . HandleErrorAttribute 中的OnException.(需要新建一个类,继承HandleErrorAttribute) 那我们到底应该在哪里处理错误好呢?下面我来给大家说说他们的区别. Application_Error 程序中发生的所有异常,都

ASP.NET MVC图片管理(上传,预览与显示)

先看看效果(下面gif动画制作有点大,5.71MB): 题外话:上面选择图片来源于Insus.NET的新浪微博:http://weibo.com/104325017 也是昨晚(2015-07-03)Insus.NET烹饪的晚餐.如果你也想学习烹饪,也可以关注Insus.NET的微博. 言归正传,由于以前的asp.net mvc的练习文件上传文件,显示或是下载等博文,均是存储于站点目录之中.这次练习是把图片存储于数据库.也就是以图片的数据流存储.在上传时我们需要把文件处理为数据库,显示时,我们需要

Asp.net MVC 自定义错误页面以及return HttpNotFound遇到的问题

今天在处理mvc 项目404和500页面时,发现我以前比较喜欢用的Return HttpNotFound()没有跳转到我在webconfig中配置的自定义404页面,而且也不会去执行Global中的Application_Error方法,经过一番查阅资料,发现这个问题得去想别的办法去做,具体的做法有三种,如下: 1.放弃Return HttpNotFound(),适用throw new HttpException(404, "page not found"); 2.让所有的Contro

ASP.NET MVC生成静态页面

1.先付上封装好生成静态页的原代码: public class Common { #region 获取模板页的Html代码 /// <summary> /// 获取页面的Html代码 /// </summary> /// <param name="url">模板页面路径</param> /// <param name="encoding">页面编码</param> /// <returns

ASP.NET MVC如何在页面加载完成后ajax异步刷新

背景:之前已写过两篇有关Ajax的随笔,这一篇是单独针对在页面加载完成的Ajax操作.比如说打开学生列表页面,先加载页面,然后以Ajax的方式,从数据库中检索相应的学生信息,给浏览者更好的体验. 简单版本:document加载完成之后,调用ajax刷新当前页面,修改pLoad的显示文本. 前台代码如下: 1 <body> 2 <div> 3 <p id="pLoad">Ajax之前的结果</p> 4 </div> 5 <

前台页面查询条件为年月日,时间间隔是同一天,数据库有数据却查不出来

如图.因为业务需求,所以前台查询条件的年月日格式设置为:"年-月-日",但是数据库中存入的是"年-月-日 时:分:秒" 然后按上图查询,查不出数据,数据库中是有好多条这一天的数据的.然后问了同事,他告诉我应该改一下DAO层的查询Hql,如图 然后就可以查询出当天时间从"00:00:00到23:59:59"的数据了.

linq中分组查询而且获取每个分组中的第一条记录,数据用于分页绑定

LINQ分组取出第一条数据 Person1: Id=1, Name="Test1" Person2: Id=1, Name="Test1" Person3: Id=2, Name="Test2" 以上list如果直接使用distinct方法进行过滤,仍然返回3条数据,而需要的结果是2条数据.下面给出解这个问题的方法: 方法1: Distinct 方法中使用的相等比较器.这个比较器需要重写Equals和GetHashCode方法,个人不推荐,感觉较