我有一个 GridView
与 SqlDataSource
相关联.
当我点击 Button
, 我改变了 SelectCommand
然后我使用 DataBind
更新 GridView
.
PostBack 后,我希望保留最新的数据,我不想要 GridView
由原版加载SelectCommand
.
我知道这是通过一个叫做 ViewState
的东西完成的, 但我没有设法以正确的方式实现它。
我都试过了EnableViewState="true"
和 EnableViewState="false"
在网格本身上,没有运气。
代码
<asp:GridView ID="GridView1" ...... DataSourceID="UsersSource" >
<asp:SqlDataSource ID="UsersSource" ... SelectCommand="SELECT * FROM USERS"></asp:SqlDataSource>
启动时,GridView
填充了 SELECT * FROM USERS
的结果.
现在我点击 Button
,它执行以下操作:
UsersSource.SelectCommand = "SELECT * FROM USERS WHERE user_id = 1";
GridView1.DataBind();
GridView
填充了新数据。
现在比方说,我点击一个表头来对这个表进行排序,会有一个回发,在它之后,这个表中的数据将包含第一次查询的结果。
这里需要做什么?
更多信息
声明:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Admin.aspx.cs" Inherits="Admin" %>
页面加载方法中没有任何内容。
最佳答案
这是设计使然。这里的问题是,当页面加载时,SqlDataSource 被重新创建,它不会在回发时维护 selectcommand,而是恢复到创建 DataSource 时设置的那个。
因此您需要告诉 SqlDataSource 在上次正确加载时它对 SelectCommand
有什么。
只需将 SQL 命令存储在 ViewState 中,并通过在 Page 指令上设置 ViewStateEncryptionMode
来启用加密以保护内容。 [始终选择安全作为标准]
<%@ Page ViewStateEncyptionMode="Always" %>
在您的按钮点击事件中,将您的新命令存储在 View 状态中:
ViewState["currentCommand"] = "SELECT * FROM USERS WHERE user_id = 1";
UsersSource.SelectCommand = ViewState["currentCommand"];
GridView1.DataBind();
现在在你的页面加载事件中,设置它:
if( ViewState["currentCommand"] !=null)
UsersSource.SelectCommand = ViewState["currentCommand"];
关于c# - 回发后将数据保留在 GridView 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18160368/