ListView+DropdownList修改selectCommand实现条件筛选
之前我以为实现这个功能很容易,之后才发现有很多问题要解决啊,花了一个晚上终于实现了,但是不知道是不是最好的办法。
查了网上很多资料,就做一个总结。
问题一:
DropdownList动态绑定select提交表单之后任然是第一项。
原因:因为提交表单之后页面会postback,就相当于页面再次实例化一样,所有控件重新生成,所以DropdownList又重新绑定数据,导致无论怎么提交,永远都是第一项~
解决办法:绑定函数放在PAGE_LOAD()里,加上if(!isPostBack)。
protected void Page_Load(object sender, EventArgs e) { if (!isPostBack) { DataBind(); } }
问题二:
如何实现DropdownList改变selectItem之后就postBack。而不用再放置一个确定按钮。
解决办法:将DropdownList属性里的autoPostBack设置为true。
问题三:
DropdownList选择条件之后,ListView里面点击编辑,删除操作的都是最初selectcommand所返回的数据,导致条件选择后的编辑删除数据与选择的不一致。
原因:和第一个问题相似,这是由于SQLDataSource中的SelectCommand是不被保留的。所以当您修改了SelectCommand后,点击了编辑后,ASP.net会自动再重新生成一次SqlDataSource,而他的SelectCommand依旧使用的还是原先默认设置中的select * from Table。所以他会从去数据库中,将所有的数据都都回来。
解决办法:将SelectCommand加入到Session或是ViewState或是Cookie中,然后再每次DataSource_Load的时候,将内容付给SqlDataSource
tips:默认的情况下ViewState 是可以被解密篡改,所以asp.net就没有把一些敏感东西放在ViewState里建议你加密ViewState
你可以参考http://www.microsoft.com/china/MSDN/library/archives/library/DNAspnet/html/asp11222001.asp
看代码吧~
protected void DptDropDownList_SelectedIndexChanged(object sender, EventArgs e) { if (DptDropDownList.SelectedIndex == 0) { ApplySqlDataSource.SelectCommand = "SELECT * FROM [Apply] ORDER BY [ID] DESC"; ViewState["SelectStr"] = "SELECT * FROM [Apply] ORDER BY [ID] DESC"; } }
protected void ApplySqlDataSource_Load(object sender, EventArgs e) { if (IsPostBack) { ApplySqlDataSource.SelectCommand = ViewState["SelectStr"].ToString(); } }