2012-04-30 46 views
0

我使用代码填充GridView,将数据源设置为查询返回的数据集。所以显然,排序和分页不会像神奇般的工作,如果我使用datasourceid =一些sqldatasource。gridview排序:每次都需要重新读取?

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

此外,如果我尝试允许分页,看来我再次必须重新执行查询,每次用户转到另一页时。如果用户对页面进行排序然后页面,那么我必须记住隐藏字段或类似内容的排序顺序,以便我可以重新读取数据,重新排序,然后进入正确的页面。

鉴于当您使用数据源控件时,所有这些行为都是内置的,我想我在这里丢失了一些东西。但是考虑到所有这些例子都是这样缓慢而艰难的,如果我错过了一些东西,很多其他程序员也会错过它。

回答

1

如果您每次通过数据集对列或页进行排序时都使用ASP.NET GridView控件,那么您正在进行服务器回发。用这个特定的控件进行排序和分页从来没有'神奇'的工作,并一直是我的一个怪物。

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

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

+0

“sorked magically”我的意思是如果你使用数据源控件,你不必编写任何代码来实现分页或排序。 – Jay

+0

是的,我知道如何使用会话数据,但我真的不喜欢这样的想法:没有可靠的方法来丢弃数据,当它没有时间需要,所以它最终会永远浮动,如果用户可以同时打开两个屏幕实例,则会遇到问题。保存在视图状态是可能的,但带宽增加一倍。通过网络读取数据的时间将超过在许多情况下重新查询数据库的时间。所以确定它是可行的,但它并不漂亮。 – Jay

+0

好吧,我明白你在说什么......个人而言,我讨厌使用数据源控件,因为它抽象了如何在引擎盖下发生的事情,但它确实节省了大量时间。ViewState并不理想,如果您可以投入一些时间使数据丢弃更可靠,则会话可能是您的选择。 – markp3rry

0

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

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

你可以在页面加载事件,运行查询一次在没有回传(你可以检查回发与

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

和用于填充电网的方法,应该从读没有必要再次运行查询

相关问题