0

我正在使用代码填充 GridView,将数据源设置为查询返回的数据集。所以显然排序和分页不仅仅像我使用datasourceid = some sqldatasource那样神奇地工作。

我在网上找到了许多如何执行此操作的示例,但它们似乎每次都重新执行查询。查询的内容不应该保存在视图状态吗?有什么方法可以只获取之前的查询结果并重新排序而无需返回数据库?(它是否将所有数据保存在视图状态?如果是,为什么我不能得到它?将它全部发送到用户的浏览器并全部发送回来似乎很愚蠢,浪费所有带宽,如果没有到达它的方法。)

此外,如果我尝试允许分页,似乎每次用户转到另一个页面时我都必须重新执行查询。如果用户先排序然后翻页,那么我必须记住隐藏字段中的排序顺序是什么,这样我就可以重新读取数据,重新排序,然后转到正确的页面。

鉴于当您使用数据源控件时,所有这些行为都是内置的,我想我在这里遗漏了一些东西。但是考虑到所有以这种缓慢而艰难的方式完成的示例,如果我遗漏了某些东西,那么很多其他程序员也会遗漏它。

4

2 回答 2

2

如果每次通过数据集对列或页面进行排序时都使用 ASP.NET GridView 控件,那么您就是在进行服务器回发。使用这种特殊控件进行排序和分页从未“神奇”地工作过,并且长期以来一直是我的烦恼。

您可以通过将构建网格的数据源存储在内存中来加快速度,无论是作为会话还是通过 ViewState。两者都有优点和缺点,我建议你阅读。

如果可能的话,我建议忘记 ASP.NET GridView 并查看客户端解决方案,例如 jQuery jqGrid。它使用 AJAX 调用来排序和分页,而且速度快得多,而且不那么令人头疼。唯一的缺点是学习曲线,但相信我从长远来看这是值得的。

于 2012-04-30T16:05:47.893 回答
0

是的,gridview 每次都重新执行查询。

如果查询时间过长,您可以手动将数据存储在会话或 ViewState 中。在填充网格的算法中,只需直接读取它们,而不是运行查询。

您可以在页面加载事件中,在没有回发时运行一次查询(您可以使用

if (!Page.IsPostBack){
    //Run the query and save it to the session
}

填充网格的方法应该直接从会话中读取。无需再次运行查询

于 2012-04-30T17:30:37.207 回答