Question

J'ai un serveur de données qui renvoie environ 30 000 enregistrements. J'affiche ces enregistrements dans un contrôle ASP: GridView. J'ai un contrôle déroulant dans lequel je veux que l'utilisateur puisse sélectionner le nombre d'enregistrements à afficher dans GridView. La valeur par défaut devrait être Tous, mais elle pourrait également avoir des valeurs telles que 20, 50, 100 par exemple. Je ne sais pas trop comment faire.

Que faire si la fonction de recherche de personne n’est pas activée? PageSize fonctionnera-t-il toujours?

J'ai codé en dur GridView.PageSize = 1 et il a quand même renvoyé tous les enregistrements.

Était-ce utile?

La solution

Si vous souhaitez que PageSize fonctionne, vous devez attribuer à AllowPaging de GridView la valeur true. Évidemment, vous devez créer la méthode pour gérer l'événement PageIndexChanging.

Comme ceci:

protected void myGvw_OnPageIndexChanging(object sender, GridViewPageEventArgs e) 
{
     myGvw.PageIndex = e.NewPageIndex;
     // then recall the method that bind myGvw
}

La propriété AutoPostBack peut être définie sur True sur DropDown et vous devez définir sur son OnSelectedIndexChanged

.
myGvw.PageSize = Convert.ToInt32(myDropDown.SelectedValue)

Autres conseils

Utilisez la propriété PageSize de gridview. Lien .

Vous pouvez ajouter la valeur du menu déroulant (20, 50, 100) à votre requête afin de ne sélectionner que les premiers enregistrements (20, 50, 100).

Allez-vous également utiliser la radiomessagerie?

La pagination doit toujours être traitée le plus tôt possible dans la sélection des données. Vous ne souhaitez pas extraire 30 000 enregistrements de la base de données sur le serveur d'applications pour n'en afficher que 50.

Quelque chose comme: (pour sélectionner la page 3, 50 par page)

select top 50 from x where pk not in (select top 100 pk from x)

qui se traduit par:

CREATE PROCEDURE sspGetItems (@pageSize int, @pageNum int)
AS
SELECT TOP @pageSize 
FROM x
WHERE pk NOT IN 
(
 SELECT TOP (@pageNum - 1) * @pageSize pk FROM x
)

Évidemment, il faudra faire plus attention au tri, etc.

Voici ce que je ferais. Premièrement, j’ajouterais au DataTable une colonne qui servirait de compteur si elle n’y figurait pas déjà. Ensuite, vous liez votre GridView à un DataView. Voici un code pour illustrer ce dont je parle:

            //add column with counter
            table.Columns.Add("counter", typeof(int));
            for (int i = 0; i < table.Rows.Count; i++)
            {
                table.Rows[i]["counter"] = i+1;
            }

Ensuite, obtenez la vue par défaut du DataTable et définissez le RowFilter:

            DataView view = table.DefaultView;
            view.RowFilter = "counter <= 100"; //or whatever number the user selected

Enfin, liez directement le GridView au DataView.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top