之前我以爲實現這個功能很容易,之後才發現有很多問題要解決啊,花了一個晚上終於實現了,但是不知道是不是最好的辦法。
查了網上很多資料,就做一個總結。
問題一:
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();
}
}