为什么gridview:true用于它是什么意思?

时间:2012-09-20 12:51:28

标签: jquery jqgrid jqgrid-asp.net

我正在研究JqGrid。

如果我们指定gridview:true,我想知道它是什么意思。

我们需要在什么情况下提供?

我最近正在研究一个这样的jqGrid而我的afterInsertRow没有被调用,一旦我重新调用gridview:true现在就调用了。

这是我自己经历的一个案例,我想知道是否还有其他案例,如果使用gridview:true,我们应该知道。

请指导我。

2 个答案:

答案 0 :(得分:14)

我同意文档中没有很好地解释gridview: true选项。在某些情况下(如TreeGrid的情况),将自动设置选项。因此,我尝试解释它的含义以及为什么我建议始终使用gridview: true选项并且永远不要使用afterInsertRow

许多人从一些其他计算机语言开始作为JavaScript,并编写了他的第一个程序,在他们有一些程序编写风格之后在Web浏览器中运行。我3年前遇到同样的问题。 了解在HTML页面上进行一些更改后,Web浏览器必须执行的操作非常重要。在使用jQuery时,你永远都会这样做。

如果更改页面上的某些DOM元素,则可以更改页面上现有的所有其他DOM元素的位置。如果您考虑浮动模型(如float: left)或许多其他CSS设置,您将了解Web浏览器不能只移动现有页面的位图表示并插入新插入的元素。因此, Web浏览器必须重新计算页面上存在的所有元素的位置,并从另一个地方的元素移动一些。即使您更改了元素的CSS样式,也会发生如此命名的重排。我建议您阅读the article并查看有关该主题的视频。

如上所述,提高网络浏览器性能的主要思路是以减少页面上的更改次数。因此,您需要在一次操作中更改一个DOM元素的5种样式。您可以将jQuery.css({...})用于所有已更改的样式,而不是5个单独的调用。更好的方法是定义一个CSS类并使用jQuery.addClass方法。

在jqGrid的情况下,需要用<tbody>填充网格的所有行和单元格。如果使用gridview: true选项,则jqGrid会将所有行的内容收集为带有HTML片段的字符串。稍后jqGrid在the line中调用jQuery.append,其中设置内部innerHTML属性以在页面上设置整个HTML片段。

由于相同的原因,您应该使用cellattrrowattrcustom formatters使用HTML片段表示单元格或行作为字符串。最后,字符串将被附加到其他字符串,并将在jQuery.append操作中使用,如上所述。

afterInsertRow回调函数的使用要求在调用afterInsertRow回调之前,网格的每一行都将放置。因此,无法使用gridview: true选项并慢慢处理页面。

确切地说,我应该提到我之前描述的性能下降只有在大网格的情况下才能看到,并且在网络浏览器速度慢的情况下(如Internet Explorer,尤其是旧版本的IE),大多数情况下都会看到。

答案 1 :(得分:5)

根据gridview的{​​{3}}:

  

在包含3.4.X的jqGrid的先前版本中,读取相对较大的数据集(行数&gt; = 100)会导致速度问题。这样做的原因是,当每个单元格被插入到网格中时,我们应用了大约5到6个jQuery调用。现在这个问题解决了;我们现在使用jQuery追加一次插入条目行。结果令人印象深刻 - 大约快3到5倍。如果我们一次插入所有数据会得到什么结果?是的,这可以通过gridview选项(将其设置为true)来完成。结果是网格速度提高了5到10倍。当然,当此选项设置为true时,我们有一些限制。 如果设置为true,我们不能使用treeGrid,subGrid或afterInsertRow事件。如果您不在网格中使用这三个选项,则可以将此选项设置为true并享受速度。

因此,通过使用此选项,您可以获得良好的速度提升,但需要注意的是它与treeGrid,subGrid或afterInsertRow不兼容。我认为这是限制的程度。如果您还没找到,请告诉我们,以便更新文档。


对于它的价值,您实际上grid.base.js方法中可以jqGrid documentation addXmlDataaddJSONData,其中afterInsertRow被跳过:

if(ts.p.gridview === false ) {
    $("tbody:first",t).append(rowData.join(''));
    $(ts).triggerHandler("jqGridAfterInsertRow", [rid, rd, xmlr]);
    if(afterInsRow) {ts.p.afterInsertRow.call(ts,rid,rd,xmlr);}
    rowData=[];
}

treeGrid和subGrid限制更加细微,并且未在代码中明确调出。