【发布时间】:2011-05-29 10:09:15
【问题描述】:
我有一个包含gridview 的aspx.Page。仅当没有发生回发并且 enableviewstate = true (页面也是)时,gridview 才在代码中绑定到数据源。在回发期间,绑定到 gridview 的数据会丢失。可能是什么原因。请询问是否需要代码。
【问题讨论】:
-
大部分时间都需要代码示例作为您提供给社区的工具,以便我们能够提供更好的帮助。
我有一个包含gridview 的aspx.Page。仅当没有发生回发并且 enableviewstate = true (页面也是)时,gridview 才在代码中绑定到数据源。在回发期间,绑定到 gridview 的数据会丢失。可能是什么原因。请询问是否需要代码。
【问题讨论】:
解决了,问题是我在带有gridview的页面的masterpage的Page_Load事件中创建了一个Page.Databind(),所以它在每次回发期间绑定了gridview而没有数据。 感谢所有的努力。
【讨论】:
Page.Databind() 在我的一个母版页中。感谢您回答您自己的问题:)
这是设计使然。从页面加载到页面加载,此数据不会本地存储在任何地方。您将需要执行以下 3 项任务之一:
我的偏好是在需要时返回数据库,并根据性能调整我的 SQL。繁重的页面加载很烦人,过多的会话内存会导致服务器速度变慢。我相信您也可以将这些数据存储在缓存中,但我从未尝试过,所以我不知道有什么限制或功能。
【讨论】:
来自问题的描述。听起来好像您正在后面的代码中进行数据绑定。在这种情况下,asp.net 不会为您保留视图状态中的数据源。尝试检索数据并将其存储在 ViewState 哈希表对象中,例如 ViewState["GridviewData"] = GridviewData
并在回发之间从那里检索它
【讨论】:
好的,我知道回复真的晚了,但我也遇到了同样的问题。
每次我加载页面时,我都是数据绑定,当有一个回发时,我需要 gridview。但是使用:
if(!IsPostBack)
{ //code used to bind on first page load }
在 Page_Load 事件中似乎有所帮助:)
【讨论】:
你在这里错过了这个概念。这是一个非常初级的问题,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
【讨论】: