2010-02-13 5 views
4

Pour commencer, j'utilise un contrôle MultiView pour guider les utilisateurs dans la recherche. La première page dans MultiView est juste une boîte de recherche avec un bouton pour préformer la recherche.ASP.NET GridView.DataBind ne pas actualiser le GridView

La deuxième page a le GridView, mais je voudrais garder le champ de recherche et le bouton pour l'utilisateur à rechercher à nouveau s'ils n'ont pas trouvé l'utilisateur qu'ils recherchaient.

Lorsque vous effectuez une recherche à partir de la première page et passez à la page 2, GridView affiche les résultats corrects. Mais quand il est sur la deuxième page avec GridView et la recherche, GridView ne se met pas à jour. Voici le code que j'utilise.

//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

Ceci est un comportement étrange, je vous suggère d'essayer une procédure stockée. –

+2

@nmiranda, L'utilisation d'une procédure stockée ou d'un SQL direct ne fait aucune différence ici. C'est la liaison de données ASP.NET qui ne se produit pas. – Eilon

+0

@Eilon, désolé par mon anglais, ce que je voulais dire, c'est que cela m'est arrivé et après avoir googlé j'ai trouvé beaucoup de gens avec le même problème et ils ont corrigé en utilisant une procédure stockée et moi aussi. utiliser une procédure stockée. –

Répondre

3

Avez-vous besoin de définir la propriété DataSource? Vous avez cet ensemble dans les commentaires au-dessus du code, mais on ne sait pas quand cela se produit. Mettez un point d'arrêt sur SearchResults.DataBind() et assurez-vous que toutes les propriétés sont correctement définies ici. Incidemment, ces types de problèmes sont la raison pour laquelle il est infiniment préférable d'utiliser une couche logique métier appropriée. Si vous contrôliez le code qui exécute réellement la requête de base de données, vous ne rencontrez pas ce problème ou ne savez pas exactement où il se trouvait.

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

EDIT: Est-ce que tout fonctionne comme vous vous attendez à si vous supprimez le MultiView? Réduisons le problème.

+0

La propriété DataSource est définie dans la page principale .aspx. Comme je l'ai dit lorsque le ViewState.ActivePageIndex change de 0 à 1 cela fonctionne très bien. Mais quand je suis déjà sur ActivePageIndex = 1, GridView ne s'actualise pas. Je ne suis pas sûr qu'il y ait un avantage à assigner la DataSource de cette façon. – jWoose

+0

L'avantage est que LoadAll() effectue réellement l'appel de la couche SQL/Data. Exactement la partie qui vous manque.Pouvez-vous forcer AddPlayerDataSource à recharger en appelant manuellement Select()? Je ne suis pas trop familier avec cet objet. – Bryan

+0

Merci. Je regardais le problème depuis trop longtemps. Le MultiView me cachait le vrai problème. J'avais des problèmes avec la zone de texte de recherche. – jWoose

0

Au lieu de déclarer une nouvelle gridview « SearchResults », puis d'appeler DataBind sur cette copie d'ombre de votre gridview, juste Databind GridView dans la vue elle-même.

il suffit d'appeler

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

au lieu de

SearchResults.DataBind();

Ensuite, vous pouvez vous débarrasser de

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

De cette façon, votre Sql Le contrôle DataSource exécute le select() lors de la liaison de données à la grille existante, pas à la copie.

+0

J'ai essayé et ça n'a pas marché. Avec C#, l'assignation des objets ne fait pas de "shadow". Il se réfère à l'objet de contrôle d'origine. – jWoose