【问题标题】:GridView loses data during postbackGridView 在回发期间丢失数据
【发布时间】:2011-05-29 10:09:15
【问题描述】:

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

【问题讨论】:

  • 大部分时间都需要代码示例作为您提供给社区的工具,以便我们能够提供更好的帮助。

标签: .net gridview postback


【解决方案1】:

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

【讨论】:

  • 同样的问题,Page.Databind() 在我的一个母版页中。感谢您回答您自己的问题:)
【解决方案2】:

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

  1. 将数据存储在 ViewState 中(如果数据很大,不一定推荐)
  2. 将数据存储在 Session 对象中(同样的情况,大数据等于内存使用率低)
  3. 每次页面加载时返回以重新绑定数据(如果数据库上的活动过多或查询速度很慢,则会崩溃)

我的偏好是在需要时返回数据库,并根据性能调整我的 SQL。繁重的页面加载很烦人,过多的会话内存会导致服务器速度变慢。我相信您也可以将这些数据存储在缓存中,但我从未尝试过,所以我不知道有什么限制或功能。

【讨论】:

  • 在这种情况下,回发数据绑定听起来像是被破坏了(如释义,“删除 DataBind 修复它”)..但是关于这个 +1 的好建议。
【解决方案3】:

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

并在回发之间从那里检索它

【讨论】:

  • 你确定吗?通常,我可以使用 EnableViewState = true 来保留数据,即使它们被绑定在后面的代码中
【解决方案4】:

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

每次我加载页面时,我都是数据绑定,当有一个回发时,我需要 gridview。但是使用:

if(!IsPostBack)
{ //code used to bind on first page load }

在 Page_Load 事件中似乎有所帮助:)

【讨论】:

  • 如果使用了所有适当的控件 ViewState,这将起作用。但是,如果不使用 ViewState,则应在每个页面加载的所有适用控件上调用 DataBind。
【解决方案5】:

你在这里错过了这个概念。这是一个非常初级的问题,google 可以为您解答。

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

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

  • Session 就像每个用户的口袋,它停留在服务器上,意味着比视图状态更快。但是大会话会消耗更多的 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 视图状态需要将任何对象转换为字符串基。你可以实现自己的序列化并分配给视图状态,例如将 DataTable 转换为 byte[] 并分配给视图状态。

尝试使用 Session

【讨论】:

  • 是的,我使用 EnableViewState 属性来保存数据。
  • 不,你完全错了,没有你的所有建议它也能正常工作。请检查一下。
  • 你很快就会发现它不起作用。新年快乐。希望我错了
  • DataTable 实际上确实实现了 ISerializable 并且在放入 VS 时它“工作”。唯一的要求是 TableName set 为非空值。 (话虽如此,DataTable 序列化效率非常低,并且没有利用 .NET VS 序列化程序。)
猜你喜欢
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2014-11-04
  • 2012-03-13
  • 1970-01-01
相关资源
最近更新 更多