谢谢。
我以前的办法比较笨,当改变SqlDataSource的命令时,随便将SELECT命令保存到一个asp:HiddenField中,然后在重新加载页面的时候将隐藏控件的值再次赋予SqlDataSource.SelectCommand。
其实还有两个办法,可以酌情使用:
1.使用SqlDataSource.FilterExpression和SqlDataSource.FilterParameters对结果进行筛选;
2.在SqlDataSource中使用带参数的命令,然后再修改参数的值。
例如:SELECT命令为“SELECT * FROM TABLE1 WHERE [id]=@id”
SqlDataSource1.SelectParameters["id"].DefaultValue="xxx";
请教个问题:如果我在btnFilter_Click()事件中将SQL语句保存在ViewState,在Page_Load()事件中判断ViewState是否存在,如果存在的话赋值给SqlDataSource1.SelectCommand,这样可以吗?(我对页面的周期理解还很不够)
另外:个人觉得2楼的方法不错,利用了SqlDataSource控件的功能,这样配置好后,btnFilter_Click()事件中不用写任何代码,就可以实现数据筛选功能了。
@陈晨
你要先了解ASP.NET 事件的顺序,Page Load 事件会比按钮的 Click 事件先发生,你的作法会发生先判断 ViewState设定 SelectCommand,后面才去设定 ViewState,会跟预期的执行顺序相反。
2楼的方法当然也可行,不过它只有限制筛选字段是固定的状况下才可以使用。
@wuya2
设定 FilterExpression 属性的做法,它是针对 DataView 下 Filter,所以会先取回所有数据再针对 DataView 下 Filter;若数据非常多时(例如十万笔数据),而筛选符合的数据只有几笔,效能上会比较不好。
2楼,我只使用了sqldatasource.FilterExpression来设置过滤参数,但是如果筛选后的结果大于1页的话,在分页时还是会将全部数据带出来
非常感谢,你的方法帮了我大忙,对比起来你的方法最优,其他方法在换页或者查询条件较复杂的时侯都会有问题。Thanks a lot!!!
--引用--------------------------------------------------
jeff377: @wuya2
<br>设定 FilterExpression 属性的做法,它是针对 DataView 下 Filter,所以会先取回所有数据再针对 DataView 下 Filter;若数据非常多时(例如十万笔数据),而筛选符合的数据只有几笔,效能上会比较不好。
--------------------------------------------------------
@wuya2的做法是效率不好
但楼主的这种做法在真正开发中也不可取,UI层夹杂了大量的SQL语句,为使程序很难维护。
比较好的做法是逻辑层封装数据库查询的过程,在UI层通过ObjcetDataSource调用逻辑层方法