2009-07-09 11 views
0

J'ai une page Web qui affiche une très grande liste de données. Comme cela bloquait le navigateur, j'ai implémenté la pagination (en utilisant PagedDataSource) pour afficher 20 billes à la fois. Mon modèle de données est tel qu'un sac contient plusieurs billes, et sur mon répéteur je montre un petit en-tête pour les informations du sac, puis tous les marbres en dessous.Exceptions au format de page lors de l'échange de données hiérarchiques

exemple En simplifiant:

 
Bag1   some Bag specific data 
-------------------------------------- 
MarbleA   328 Some St. USA 
MarbleB   364 another ave. USA 
MarbleC   7878 Whatever Way USA 

Bag2   some Bag specific data 
-------------------------------------- 
MarbleD   684 Dummy Dr. USA 

etc. 

Le problème est, depuis ma taille de page est 20, je peux couper la Marbles d'un sac à la fin d'une page. (Imaginez MarbleB était le 20ème élément.) Cela provoque les marbres restants à déborder vers le haut de la page suivante.

Existe-t-il un moyen élégant de vérifier cela, ou est-ce que je vais devoir mettre en œuvre ma propre pagination et ajouter une logique «regarder vers l'avant jusqu'au prochain sac»?

Edit: supposer C# 2.0, VS2008, SQL 2005

Répondre

1

Vous pouvez gérer une partie de celui-ci avec votre requête SQL (en supposant SQL Server 2005). Si vous introduisez RANK à la suite, vous pouvez déterminer combien de lignes chaque résultat prend. Voici une exemple de requête qui pourrait être dans un sproc:

SELECT RANK() OVER (ORDER BY b.BagID) as RowNum, b.BagID, b.BagInfo, m.MarbleInfo 
FROM Bag b 
JOIN Marble m ON m.BagID = b.BagID 
WHERE b.BagID > @BagID 

@BagID serait le « départ » bagID (initialement -1), vous pouvez l'appeler avec la bagID se termine précédemment si vous vouliez.

Les résultats ressemblerait à quelque chose comme ceci:

1,1,1 
1,1,2 
1,1,3 
4,2,4 
4,2,5 
6,3,6 
... 

Au sein de votre mise en page que vous pourriez faire un contrôle sur la colonne ROWNUM pour voir si elle est dans la limite de la taille de la page. Bien sûr, le dos de tirage serait si vous aviez un sac avec une grande quantité de billes en son sein, etc.

EDIT: Si la fonctionnalité de RANK ne sont pas à votre disposition dans votre SGBDR, un résultat similaire pourrait être accompli dans un sproc en utilisant une table temporaire et un curseur.

+0

Cette fonctionnalité a été repoussée, mais une fois que j'y reviendrai, ce sera probablement la méthode que j'essaie (au moins pour le tour 1). Merci. –