2012-02-13 83 views
0

你好,我正在使用jqgrid加载一些.net MVC 3.0 C#应用程序中的数据。jqgrid工具栏搜索或外部搜索功能

有一个材料网格需要在大约6个不同的地方加载。他们都是一样的。网格列出了大约8700个项目的定价和细节。

我遇到的问题是两列“成本”和“价格”具有从数据库执行的计算。这两列使网格加载非常缓慢。

我们合作的材料测试列表最初有730个项目。第一次没有某种优化,电网需要大约1分30秒才能完全加载。变化之后,这降低到大约4秒,这是可以接受的。

我们现在正在处理将用于材料的真实列表,并且此列表包含8500个项目。在负载之后,它正在谈论2分钟,通过观看来装载8500个物品。

这真的不能接受,所以我认为最好的解决方案是让搜索工具栏功能或外部搜索加载项目,但只有搜索结果项目。

所以我想看到的是,在加载初始页面后,网格是空的,只有在搜索完成后才会填充,并且只显示搜索结果。

如果可能的话,最好能够使用搜索工具栏功能来做到这一点。这已经正常工作,但经过了长时间的负荷。

任何建议将非常欢迎。我不是原始程序员只是想获得一些信息,所以如果可能的话,我不必为我的开发支付谷歌搜索。

谢谢您的时间,如果需要在当前的代码示例,请让我知道它是否会帮助或如果你能提供一些示例代码,如果我需要的是可能的,

塞雷尔语端代码:

public ActionResult EstimateMaterialAddGridData(string sidx, string sord, int page, int rows) 
    { 

     IQueryable<Material> mats; 
     mats = Material.Find(x => x.OwnerId == UserAccount.GetOwnerId && x.isDeletedFromCatalog == false).AsQueryable(); 

     int pageIndex = page - 1; 
     int pageSize = rows; 
     int totalRecords = mats.Count(); 
     int totalPages = (int)Math.Ceiling((float)totalRecords/(float)pageSize); 
     var jsonData = new 
     { 
      total = totalPages, 
      page = page, 
      records = totalRecords, 
      rows = (
       from sub in mats 
       select new 
       { 
        i = sub.Id, 
        cell = new string[] { 
         sub.Id.ToString(), 
         sub.Id.ToString(), 
         sub.Id.ToString(), 
         sub.ProductCode, 
         sub.Description, 
         sub.Units, 
         sub.Categories, 
         sub.UnitCost.ToString(), 
         sub.Price.ToString() 
        } 
       } 
      ).ToArray() 
     }; 

     return Json(jsonData); 
    } 

JS网格code`jQuery(文件)。就绪(函数(){ VAR网格= jQuery的( “#MGRID”);

grid.jqGrid({ 
    url: '/Material/EstimateMaterialAddGridData', 
    datatype: 'json', 
    mtype: 'POST', 
    colNames: ['Id', '','View/Edit', 'Product Code', 'Description', 'Units', 'Categories', 'Cost', 'Price'], 
    colModel: [ 
     { name: 'Id', index: 'Id', key: true, hidden: true, editrules: { edithidden: true} }, 
     { name: 'Add', index: 'Add', sortable: false, width: 50,search:false, resizable: false, editable: false, align: 'center', formatter: formatLink, classes: 'not-editable-cell' }, 
     { name: 'Open', index: 'Open', sortable: false, width: 90,search:false, resizable: false, editable: false, align: 'center', formatter: formatLinkNew, classes: 'not-editable-cell' }, 
     { name: 'ProductCode', index: 'ProductCode', sorttype: 'text',search:true, width: 100, resizable: false }, 
     { name: 'Description', index: 'Description', sorttype: 'text',search:true, width: 275, resizable: false }, 
     { name: 'Units', index: 'Units', sorttype: 'text', width: 75,search:true, resizable: false }, 
     { name: 'Categories', index: 'Categories', sorttype: 'text',search:true, width: 300, resizable: false, editable: false, }, 
     { name: 'UnitCost', index: 'UnitCost', sorttype: 'float', width: 75,search:true, align: 'right', resizable: false, editable: false, formatter: 'currency' }, 
     { name: 'Price', index: 'Price', sorttype: 'float', width: 75, search:true,align: 'right', resizable: false, editable: false, formatter: 'currency' }, 
    ], 
    pager: '#mpager', 
    height: '100%', 
    rowNum: 10, 
    rowList: [10, 20, 50, 100], 
    sortname: 'Id', 
    sortorder: 'desc', 
    sortable: true, 
    loadonce: true, 
    ignoreCase: true, 
    viewrecords: true, 
    caption: 'Material', 
    cellEdit: false, 
    hidegrid: false, 
    viewrecords: true, 

}); 

grid.jqGrid('navGrid', '#mpager', 
    { resize: false, add: false, del: false, search: true, refresh: true, edit: false, alerttext: 'Please select an material' } 
).jqGrid('navButtonAdd', '#mpager', 
    { title: "Create New Material Catalouge", buttonicon: "ui-icon-plus", onClickButton: newMaterial, position: "First", caption: "" });` 
+0

你可以包括目前使用jqGrid的代码吗?你能否提供更多关于“成本”和“价格”栏目实施的信息。我不明白为什么你应该对列有任何问题。产生列值的SELECT是否太慢? – Oleg 2012-02-13 10:34:14

回答

1

我可以转发你给以下两个老答案:thisthis。答案包含演示项目,演示如何使用jqGrid中的搜索工具栏。

我应该提到以下几点,可以显着提高的jqGrid

  • 的性能,你应该始终使用的jqGrid的gridview: true选项。在我看来,它应该是jqGrid中的默认选项。
  • 你应该明确地使用服务器端分页。我看不出一次显示用户8500+(或730)项目的意义。没有监视器可以显示这些项目,也没有用户可以同化这些项目中的信息。用户真正需要的是能够对数据进行智能过滤 - 您决定走自己的路。我主要使用searching toolbaradvanced searching中的网格过滤组合来帮助高级用户构建更复杂的搜索过滤器。此外,您可以考虑将一些常用的过滤器保存在预定义的命名过滤器模板中。您可以在“搜索”/“搜索模板”下找到the official demo page上的过滤器模板示例。另一种方法是使用外部过滤器。在the answer你会发现实施细节,可以帮助你的方式。
  • 如果要防止首次加载网格,最初可以使用datatype: 'local',这会跳过对服务器的任何请求。要激活与服务器的通信,您可以根据需要将datatype更改为'json''xml'。例如,您可以将$(this).jqGrid('setGridParam', {datatype: 'json'});直接放置在loadComplete的内部。
+0

好吧,看看这个看看它是否可以工作。只是为了澄清我的网格设置为只显示每页20个结果。即使它是这样设置的,整个8500+项目都会在后台加载,所以当我转到第2,3,4页时......它们都已经加载完毕。如果更改为仅在每次输入20个搜索字词时加载20个页面,它只会查看20个加载的项目,或者仍然会查看所有8300项目? – GTITC 2012-02-14 04:35:30

+0

@ user1206514:应该在服务器端*上执行像分页和排序这样的搜索。服务器获取当前的过滤器作为'filters'参数。您应该将SELECT的'WHERE'部分构造到数据库,并且像以前那样仅向请求的页面返回给客户端。所请求的页面由'page'和'rows'参数标识。如果您按照该方案执行前一个查询(获取另一个页面)的结果,则完整SELECT(无分页)的数据可以缓存在数据库中。所以选择另一个页面通常很快。 – Oleg 2012-02-14 06:05:32

+0

@ user1206514:如果您使用服务器端分页,排序和*过滤*以及您是否仔细实施了所有部分,则无论如何,每页通常少于1秒,因为数据的装载时间类似10000个项目。如果使用SQL参数构建查询的WHERE部分,则不会受到任何SQL注入攻击。所以你可以真正实现所有不仅快速而且安全的工作。 – Oleg 2012-02-14 06:09:10