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


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章