我有一个包含gridview的aspx.Page。仅当没有回发并且enableviewstate = true(页面也是如此)时,gridview才会在代码中绑定到数据源。在回发期间,绑定到gridview的数据将丢失。可能是什么原因。请询问是否需要代码。
答案 0 :(得分:12)
解决了它,问题是我在带有gridview的页面母版页的Page_Load事件中创建了一个Page.Databind(),因此它在每次回发期间绑定了gridview而没有数据。 感谢您的所有努力。
答案 1 :(得分:3)
这是设计的。此数据不会存储在从页面加载到页面加载的本地任何位置。您需要执行以下3项任务之一:
我的偏好是在需要时返回数据库并保持我的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事件中的似乎有所帮助:)