2009-07-30 6 views
5

J'ai une page avec un contrôle ListView et un contrôle Dataapager. Le listviews source de données est définie à l'aide programatically ce code:LINQ et pagination avec listview

 
Dim dal as new dalDataContext 
Dim bookmarks = From data In dal.getData(userid) 
listview1.DataSource = bookmarks 
listview1.DataBind() 

Lorsque je teste cette page dans un navigateur, il arrive avec l'erreur: « ListView avec id « ListView1 » doit avoir une source de données qui soit implémente ICollection ou peut effectuer la pagination de la source de données si AllowPaging est true. '

Comment puis-je implémenter la pagination dans ce scénario?

Merci

Répondre

18

Essayez

listview1.DataSource = bookmarks.ToArray() 

J'ai eu le même problème cette semaine.

+0

Merci beaucoup! Réponse très rapide. Je ne peux pas croire que c'était quelque chose d'aussi simple. – j82374823749

+0

Un problème mineur, je dois cliquer deux fois sur les numéros de pages avant de passer à la page suivante ou précédente. Aucune idée sur la façon de résoudre ça? Merci. – j82374823749

+1

Mieux encore utiliser 'ToArray()' - il est légèrement plus léger si vous n'avez pas réellement besoin de toutes les fonctionnalités de 'List' (comme l'ajout de nouveaux éléments) - ce qui n'est pas le cas ici; et les tableaux implémentent ICollection (et IList) autrement. –

2

Une réponse au problème de clic deux fois que l'OP a rencontré par la suite - déplacer le au gestionnaire Databind d'événements OnPreRender:

protected void Page_PreRender(object sender, EventArgs e) 
    { 
     listview1.DataBind(); 
    } 
0

ou peut-être créer un propriétés de la page et l'évolution bindlistview là.

protected void lv_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e) 
{ 
    //set current page startindex, max rows and rebind to false 
    DataPager dp = lvNews.FindControl("lvDataPager1") as DataPager; 
    dp.SetPageProperties(e.StartRowIndex, e.MaximumRows, false); 

    BindListView(); 
}