GridView在回发期间丢失数据

时间:2010-12-22 13:34:46

标签: .net gridview postback

我有一个包含gridview的aspx.Page。仅当没有回发并且enableviewstate = true(页面也是如此)时,gridview才会在代码中绑定到数据源。在回发期间,绑定到gridview的数据将丢失。可能是什么原因。请询问是否需要代码。

5 个答案:

答案 0 :(得分:12)

解决了它,问题是我在带有gridview的页面母版页的Page_Load事件中创建了一个Page.Databind(),因此它在每次回发期间绑定了gridview而没有数据。 感谢您的所有努力。

答案 1 :(得分:3)

这是设计的。此数据不会存储在从页面加载到页面加载的本地任何位置。您需要执行以下3项任务之一:

  1. 将数据存储在ViewState中(如果数据很大,则不一定推荐)
  2. 将数据存储在Session对象中(相同的故事,大数据等于错误的内存使用)
  3. 每次加载页面时返回重新绑定数据(如果数据库上的活动太多或者查询速度很慢,则会发生故障)
  4. 我的偏好是在需要时返回数据库并保持我的SQL性能调整。繁重的页面加载很烦人,会话内存过多会导致服务器速度变慢。我相信你也可以将这些数据存储在缓存中,但我从来没有尝试过,所以我不知道它有什么限制或能力。

答案 2 :(得分:0)

从问题的描述。听起来好像你正在后面的代码中进行数据绑定。在这种情况下,asp.net不会为您保留视图状态中的数据源。尝试检索数据并将其存储在ViewState哈希表对象中,类似ViewState["GridviewData"] = GridviewData

并在回发之间从中回复

答案 3 :(得分:0)

你在这里错过了这个概念。这是谷歌可以为您解答的一个非常基本的问题。

无论如何,事情是所有DataBound控件的'DataSource'将表现为只读,它将在需要绑定控件时读取。要保持数据存在,您还需要其他方法。例如ViewState或Session

  • ViewState就像一个嵌入页面的口袋。如果更大,页面加载会更慢。您存储的对象将序列化为基于字符串的数据。较大的对象会导致更大的视图状态和更大的带宽。请记住,对象必须是可序列化的。

  • Session就像每个用户的口袋,它停留在服务器上,意味着比viewstate更快。但是大会话将消耗更多的RAM

编辑 不,你还是弄错了。启用ViewState没有帮助。让我们来看看结构。

<html>
 <head>  
 </head>
 <body>
  <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="..." />
 </body>
</html>

输入是(实际)ViewState。当你设置启用ViewState到WebControls时,它将存储'一些可序列化(主要是值类型)'数据。在你的情况下,GridView.EnableViewState意味着它将在它自己的(逻辑)ViewState中存储一些属性而不是页面ViewState。

在this.ViewState [“someName”] = ...后面的代码中是页面ViewState。我们来看看服务器端代码。

this.ViewState["someName"] = somDataTable; // this won't work
this.ViewState["someID"] = "abc"; // this work fine

因为DataTable没有ISerializable,所以viewstate需要将任何对象转换为字符串base。你可以实现你自己的serilization并分配给viewstate,例如将DataTable转换为byte []并分配给视图状态。

尝试Session而不是

答案 4 :(得分:0)

好的,我知道回复真的很晚,但我遇到了同样的问题。

每次我加载页面时都是数据绑定,当有回发帖时,gridview被重新查询。但是使用:

if(!IsPostBack)
{ //code used to bind on first page load }
Page_Load事件中的

似乎有所帮助:)