我有一个绑定到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.
有什么方法吗?
谢谢,
标记
解决方法
这里的问题是当页面加载由寻呼机链接发出的提交时,会重新创建sqlDataSource.没有什么可以告诉它加载动态设置的内容.如果您要使用带参数的存储过程,则ASP会将参数保存到ViewState,并在加载页面时重新运行sqlDataSource中的select.
所以你要做的就是告诉sqlDataSource它在上次正确加载时对sql有什么用处.
最简单的方法是在设置sqlDataSource的SelectCommand时将View存储在ViewState中,然后在Page_Load事件中再次检索它并将其重新设置.
例如:假设您有一些标准的TextBox和一个搜索按钮.当用户在TextBox中输入一些文本,然后单击“搜索”按钮时,您希望它构建一些sql(顺便说一下,这会让您大量接触sql注入攻击.确保您擦除了标准好.)然后设置sqlDataSource的SelectCommand属性.在这一点上,您可能希望保存sql.然后在Page_Load事件中,您需要检索它并将SelectCommand属性设置为该值.
在Click of your按钮中,您可以存储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