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();
            }
        }


 

posted @ 2011-08-31 09:19  leestar54  阅读(436)  评论(0编辑  收藏  举报