4

我有一个GridView绑定到SqlDataSource一个默认值SelectCommand定义如下:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" DataSourceMode="DataSet"
      ConnectionString="<%$ ConnectionStrings:MyConn %>" 
      ProviderName="MySql.Data.MySqlClient" 
      SelectCommand="select * from blah blah" />

在某些情况下,我必须在运行时动态更改此查询,因此我执行以下操作:

SqlDataSource1.SelectCommand = sql; // 'sql' is the new query
GridView1.PageIndex = 0;
GridView1.EditIndex = -1;
GridView1.SelectedIndex = -1;
GridView1.DataBind();
updatePanel.Update();

这实际上工作得很好,但是当我单击分页控件时,结果集默认返回SelectCommandSqlDataSource1.

有什么办法吗?

谢谢,马克

4

2 回答 2

8

这里的问题是,在 Pager 链接发出的提交页面加载时,SqlDataSource 正在重新创建。没有什么可以告诉它动态加载您设置的内容。如果您要使用带参数的存储过程,那么 ASP 会将参数保存到 ViewState 并在页面加载时重新运行 SqlDataSource 中的选择。

所以你要做的就是告诉 SqlDataSource 上次正确加载时它对 SQL 有什么。

最简单的方法是在设置 SqlDataSource 的 SelectCommand 时将 SQL 存储在 ViewState 中,然后在 Page_Load 事件中再次检索它并重新设置它。

例如:假设您有一个用于某些条件的 TextBox 和一个 Search 按钮。当用户在 TextBox 中输入一些文本然后单击“搜索”按钮时,您希望它建立一些 SQL(顺便说一下,这会使您面临 SQL 注入攻击的巨大风险。确保您擦洗您的条件很好。)然后设置 SqlDataSource 的 SelectCommand 属性。正是在这一点上,您希望节省 SQL。然后在 Page_Load 事件中,您需要检索它并将 SelectCommand 属性设置为该值。

在单击按钮中,您可以存储 SQL:

Dim sSQL as String

sSQL = "SELECT somefields FROM sometable WHERE somefield = '" & Me.txtCriteria.Text & "'"
SqlDataSource1.SelectCommand = sSQL
ViewState("MySQL") = sSQL

然后在 Page_Load 事件中,您可以检索 SQL 并设置 SelectCommand 属性:

Dim sSQL as String

If Me.IsPostBack() Then
    sSQL = ViewState("MySQL")
    SqlDataSource1.SelectCommand = sSQL
End If
于 2011-02-28T15:37:54.807 回答
0

1)尝试从页面预览中设置数据源,而不是动态设置。这是最明确的解决方案如果你不能,

2)尝试在page_load之前生成列表。我认为将代码放在 page_init 下可能会奏效。我现在记不清了,但是page_load之前有一个方法。

于 2010-07-23T15:06:17.897 回答