Mar*_*man 4 asp.net pagination gridview sqldatasource selectcommand
我有一个GridView绑定到SqlDataSource一个默认的SelectCommand定义是这样的:
<asp:SqlDataSource ID="SqlDataSource1" runat="server" DataSourceMode="DataSet"
ConnectionString="<%$ ConnectionStrings:MyConn %>"
ProviderName="MySql.Data.MySqlClient"
SelectCommand="select * from blah blah" />
Run Code Online (Sandbox Code Playgroud)
有些情况下我必须在运行时动态更改此查询,因此我执行以下操作:
SqlDataSource1.SelectCommand = sql; // 'sql' is the new query
GridView1.PageIndex = 0;
GridView1.EditIndex = -1;
GridView1.SelectedIndex = -1;
GridView1.DataBind();
updatePanel.Update();
Run Code Online (Sandbox Code Playgroud)
实际上这很好用,但是当我单击分页控件时,结果集默认返回到中SelectCommand定义的SqlDataSource1.
有什么方法吗?
谢谢,马克
这里的问题是当页面加载由寻呼机链接发出的提交时,会重新创建SqlDataSource.没有什么可以告诉它加载动态设置的内容.如果您要使用带参数的存储过程,则ASP会将参数保存到ViewState,并在加载页面时重新运行SqlDataSource中的select.
因此,您需要做的是告诉SqlDataSource它在上次正确加载时对SQL有什么用处.
最简单的方法是在设置SqlDataSource的SelectCommand时将SQL存储在ViewState中,然后在Page_Load事件中再次检索它并将其重新设置.
例如:假设您有一些标准的TextBox和一个搜索按钮.当用户在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
Run Code Online (Sandbox Code Playgroud)
然后在Page_Load事件中,您可以检索SQL并设置SelectCommand属性:
Dim sSQL as String
If Me.IsPostBack() Then
sSQL = ViewState("MySQL")
SqlDataSource1.SelectCommand = sSQL
End If
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
31465 次 |
| 最近记录: |