2010-02-13 111 views
4

要開始我正在使用MultiView控件來引導用戶搜索。 MultiView中的第一頁只是一個搜索框,其中包含一個用於執行搜索的按鈕。ASP.NET GridView.DataBind不刷新GridView

第二頁有GridView,但我想保留搜索框和按鈕供用戶再次搜索,如果他們沒有找到他們正在尋找的用戶。

當您從第1頁進行搜索並移至第2頁時,GridView將顯示正確的結果。但是當它在GridView和搜索的第二頁上時,GridView不會更新。以下是我正在使用的代碼。

//GridView = SearchResults 
//SqlDataSource = AddPlayerDataSource 
//MultiView = PlayerSearchView 

protected void PlayerSearch_Click(object sender, ImageClickEventArgs e) 
{ 
    string userId = User.Identity.Name.ToString(); 

    if (SearchText.Text != "" && !userId.Equals("")) 
    { 
     GridView SearchResults = (GridView)PlayerSearchView.FindControl("SearchResults"); 

     string SqlSelect = "SELECT [id], [username] FROM [users] WHERE [username] LIKE '%" + SearchText.Text + "%'"; 
     AddPlayerDataSource.SelectCommand = SqlSelect; 
     SearchResults.DataBind(); 

     if (PlayerSearchView.ActiveViewIndex != 1) 
      PlayerSearchView.ActiveViewIndex = 1; 
    } 
} 
+0

這是一個奇怪的行爲,我建議你嘗試一下存儲過程。 – 2010-02-13 02:24:04

+2

@nmiranda,無論是使用存儲過程還是直接使用SQL都沒有什麼不同。這是沒有發生的ASP.NET數據綁定。 – Eilon 2010-02-13 02:43:28

+0

@Eilon,對不起我的英語,我的意思是它發生在我身上,在我Google搜索後,我發現許多人有同樣的問題,他們固定使用存儲過程,我也是這樣。這就是爲什麼我建議使用存儲過程。 – 2010-02-13 15:35:41

回答

3

您是否需要設置DataSource屬性?你在代碼上面的註釋中已經有了,但是現在還不清楚這是什麼時候發生的。在SearchResults.DataBind()上放置一個斷點並確保在此處正確設置所有屬性。

順便說一句......這類問題是爲什麼使用合適的業務邏輯層無限可取的原因。如果您控制的是實際執行數據庫查詢的代碼,則要麼沒有此問題,要麼確切知道它在哪裏。

GridView SearchResults = (GridView)PlayerSearchView.FindControl("SearchResults"); 
SearchResults.DataSource = Data.Players.LoadAll(); //Loads a DataTable with your data 
SearchResults.DataBind(); 

編輯: 是否一切工作,你期望它,如果你刪除了多視圖的方式嗎?我們來縮小這個問題。

+0

DataSource屬性在.aspx主頁面中設置。正如我所說的,當ViewState.ActivePageIndex從0變爲1時,它可以正常工作。但是當我已經在ActivePageIndex = 1時,GridView不會刷新。我不確定這樣分配DataSource有什麼好處。 – jWoose 2010-02-14 02:33:34

+0

好處是LoadAll()實際上正在進行SQL /數據層調用。恰恰是你缺少的部分。你可以通過手動調用Select()來強制AddPlayerDataSource重新加載嗎?我不太熟悉這個對象。 – Bryan 2010-02-14 03:57:17

+0

謝謝。我一直在考慮這個問題太久。 MultiView隱藏了我真正的問題。我在搜索文本框中遇到問題。 – jWoose 2010-02-14 14:43:43

0

而是宣佈了新的GridView「SearchResult所」,然後調用數據綁定在你的GridView的影子副本的,只是在數據綁定視圖本身的GridView控件。

只需撥打

((GridView)PlayerSearchView.FindControl("SearchResults")).DataBind()

,而不是

SearchResults.DataBind();

然後你就可以擺脫

GridView SearchResults = (GridView)PlayerSearchView.FindControl("SearchResults");

這樣,你的SQL當數據綁定現有的gridview時,DataSource控件將執行select(),而不是副本。

+0

我確實嘗試過,並沒有奏效。使用C#時,對象的分配不會產生「影子」副本。它指的是原始的控制對象。 – jWoose 2010-02-13 07:02:02