3

我有一个GridViewSqlDataSource.

当我单击 aButton时,我更改了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

现在我单击 a Button,它执行以下操作:

UsersSource.SelectCommand = "SELECT * FROM USERS WHERE user_id = 1";
GridView1.DataBind();

GridView新数据填充。

现在假设,我点击一个表头对这个表进行排序,会有一个回发,在它之后,这个表中的数据将包含第一次查询的结果。

这里需要做什么?

更多信息

宣言:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Admin.aspx.cs" Inherits="Admin" %>

Page Load 方法中没有任何内容。

4

1 回答 1

4

这是设计使然。这里的问题是 SqlDataSource 在页面加载时被重新创建,它不会在回发时维护 selectcommand,而是恢复到创建 DataSource 时设置的命令。

因此,您需要告诉 SqlDataSourceSelectCommand 它上次正确加载时的用途。

ViewStateEncryptionMode只需将 SQL COMMAND 存储在 ViewState 中并通过设置Page 指令启用加密以保护内容。[始终选择安全作为标准]

<%@ 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"];

参考微软的这篇文章:http ://connect.microsoft.com/VisualStudio/feedback/details/105069/sqldatasource-selectcommand-not-persisting-on-postback

于 2013-08-10T18:36:44.063 回答