2010-05-17 7 views
5

J'ai un ListView ASP.NET paginé. Les données affichées sont filtrées, ce qui peut être contrôlé par un formulaire. Lorsque le formulaire de filtre change, je crée une nouvelle requête et exécute un DataBind.Comment forcer ListView à afficher la première page par programme

Le problème cependant, quand je vais à la page suivante, et établissons un filtre, le ListView montre "aucune donnée a été retournée". Ce n'est pas bizarre, car après l'application du filtre, il n'y a qu'une seule page de données.

Donc, ce que je veux faire est de réinitialiser le pager. Est-ce une bonne solution au problème? Et comment je fais ça?

+0

Utilisez-vous QueryStringFields dans Pager ou celui de ViewState? – eugeneK

+0

Non. La seule chose non standard que je fais est, je reconstruis la requête Linq avec chaque postback ... – doekman

Répondre

9

J'utilise ce hack dans mon gestionnaire de charge. Il ne réinitialisera pas le téléavertisseur si le nombre d'éléments de résultat est le même, mais l'index de la page sera toujours valide afin que je puisse vivre avec cela pour le moment.

+0

Fonctionne pour moi. Veillez à définir ceci avant que la vue de liste ne soit liée aux données. – rdans

4

Si vous savez comment le faire, c'est simple. J'ai ajouté le code ci-dessous pour mes onchange -événements de mon filtre:

DataPager pager = ListViewReference.FindControl("DataPagerId") as DataPager; 
if (pager != null) 
{ 
    pager.SetPageProperties(0, pager.PageSize, true); 
} 
1

Chacune des solutions ci-dessus sont correctes, les deux appellent la même méthode. Je pense juste qu'il devrait être souligné que vous devriez appeler yourPagerElement.SetPageProperties(...) partout où vous voulez que votre source de données (c'est-à-dire une liste ou un tableau, etc.) soit mise à jour. Par exemple, après avoir appliqué une filtration ou quelque chose qui change considérablement la taille de la liste.

0

Vous pouvez avoir des problèmes si votre listview est limitée automatiquement (c.-à-ObjectDataSource)

gestionnaire d'événements de charge ne fonctionne pas, parce que vous n'êtes pas encore la nouvelle valeur de DataPager.TotalRowPage, mais vous pouvez gérer Page_PreRenderComplete, comme ceci:

protected void Page_PreRenderComplete(object sender, EventArgs e) 
    { 
     // PreRenderComplete occurs just after databindings page events 
     // And saves to viewstate 

     // Trick on search to avoid "No data" on results when old page is greater than actual row count     
     if (DataPager1.StartRowIndex > DataPager1.TotalRowCount) 
      DataPager1.SetPageProperties(0, DataPager1.MaximumRows, true); 
    } 

Cela laisse toujours ListView dans une page avec des données. Si la page est supérieure à TotalRow, passez à la première page.

Remarques: J'utilise la pagination efective et ne retournant que les données à afficher, donc je dois rebind de source de données (dernier paramètre (true))

Moins: Double DataBind si StartRowIndex est supérieure à TotalRowCount .

Questions connexes