在PostBack之后将数据保存在GridView中

时间:2013-08-10 09:04:12

标签: c# asp.net gridview postback viewstate

我有GridViewSqlDataSource相关联。

点击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" %>

页面加载方法中没有任何内容。

1 个答案:

答案 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