我有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" %>
页面加载方法中没有任何内容。
答案 0 :(得分:4)
这是设计的。这里的问题是当页面加载时重新创建SqlDataSource它不会在回发时维护select命令,而是恢复到创建DataSource时设置的那个。
所以你需要告诉SqlDataSource它在上次正确加载时对SelectCommand
的含义。
只需将SQL COMMAND存储在ViewState中,并通过在Page指令上设置ViewStateEncryptionMode
来启用加密来保护内容。 [始终选择安全作为标准]
<%@ Page ViewStateEncyptionMode="Always" %>
在按钮单击事件中,将新命令存储在视图状态:
ViewState["currentCommand"] = "SELECT * FROM USERS WHERE user_id = 1";
UsersSource.SelectCommand = ViewState["currentCommand"];
GridView1.DataBind();
现在在您的页面加载事件中,设置它:
if( ViewState["currentCommand"] !=null)
UsersSource.SelectCommand = ViewState["currentCommand"];
请参阅Microsoft的这篇文章:http://connect.microsoft.com/VisualStudio/feedback/details/105069/sqldatasource-selectcommand-not-persisting-on-postback