我有一个绑定(bind)到 SqlDataSource
的 GridView
,默认的 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();
这实际上工作得很好,但是当我单击分页控件时,结果集默认返回到 SqlDataSource1
中定义的 SelectCommand
。
有办法解决这个问题吗?
谢谢, 标记
最佳答案
这里的问题是,当页面在 Pager 链接发出的提交后加载时,SqlDataSource 会被重新创建。没有什么可以告诉它动态加载您设置的内容。如果您要使用带有参数的存储过程,那么 ASP 会将参数保存到 ViewState 中,并在页面加载时重新运行 SqlDataSource 中的选择。
所以你要做的就是告诉 SqlDataSource 最后一次正确加载时它为 SQL 提供了什么。
最简单的方法是在设置 SqlDataSource 的 SelectCommand 时将 SQL 存储在 ViewState 中,然后在 Page_Load 事件中再次检索它并将其设置回来。
例如:假设您有一个用于某些条件的文本框和一个搜索按钮。当用户在文本框中输入一些文本,然后单击“搜索”按钮时,您希望它构建一些 SQL(顺便说一下,这会让您面临 SQL 注入(inject)攻击的巨大风险。请务必清理您的 SQL 注入(inject)攻击)条件。),然后设置 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
关于asp.net - 在运行时更改 SqlDataSource.SelectCommand 会中断分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3319358/