Maison >développement back-end >Tutoriel C#.Net >Code de pagination hautes performances ASP.NET
J'ai eu du mal avec la pagination récemment. Je me souviens que j'avais déjà publié une méthode pour modifier la pagination DW ASP, et que j'avais ensuite écrit une pagination ASP manuelle. Maintenant que j'entre dans .NET, je dois bien sûr coopérer avec. procédures stockées pour créer une pagination haute performance purement manuelle.
Pourquoi est-ce appelé haute performance ? Pourquoi doit-il être construit manuellement au lieu d'utiliser les contrôles de pagination existants de .NET ? Cela remonte à l'époque où j'ai modifié DW ASP ? la pagination, et je ne connaissais pas grand-chose en programmation à cette époque. Je sais seulement comment résoudre les problèmes, et encore moins parler des problèmes de performances. J'étais très contrarié à l'époque, alors j'ai demandé à mon directeur technique personnel, M. Zhang, pour m'aider à jeter un œil. À ce moment-là, M. Zhang m'a regardé avec un regard dédaigneux et a dit : Est-ce que ça vaut le coup
Ensuite, j'ai créé une pagination ASP à la main et je n'ai pas pu le faire. M. Zhang m'a lancé un tas de code .NET : Étudiez-le vous-même. Puis il a ajouté une autre phrase Mots : Utilisez .NET pour le faire, vous pouvez le faire en quelques mots, ne vous embêtez pas avec ça. 🎜>
Plus tard, j'ai découvert que le processus de pagination précédent consistait à lire l'intégralité de l'ensemble de données, puis à effectuer le processus de pagination. Une fois que la quantité de données est trop importante, le traitement sera très lent, voire le serveur plantera. . Ensuite, la pagination précédente ne peut pas défiler comme un curseur, elle est toujours fixe dans un groupe, et il est impossible d'obtenir l'effet du numéro de page actuel au milieu
Parlons-en ensuite. contrôle de pagination, il peut en effet être résolu en quelques mots, mais le défaut est le premier problème que j'ai trouvé, à savoir qu'il est inefficace de lire toutes les données puis de les traiter, j'ai donc finalement commencé à construire ASP.NET uniquement en hand. Pagination haute performance.
La première est la procédure stockée, qui ne supprime que les données dont j'ai besoin, si le nombre de pages dépasse le nombre total de données, elle renvoie automatiquement l'enregistrement de la dernière page :
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Clear -- Create date: 2007-01-30 -- Description: 高性能分页 -- ============================================= Alter PROCEDURE [dbo].[Tag_Page_Name_Select] -- 传入最大显示纪录数和当前页码 @MaxPageSize int, @PageNum int, -- 设置一个输出参数返回总纪录数供分页列表使用 @Count int output AS BEGIN SET NOCOUNT ON; DECLARE -- 定义排序名称参数 @Name nvarchar(50), -- 定义游标位置 @Cursor int -- 首先得到纪录总数 Select @Count = count(tag_Name) FROM [viewdatabase0716].[dbo].[view_tag]; -- 定义游标需要开始的位置 Set @Cursor = @MaxPageSize*(@PageNum-1)+1 -- 如果游标大于纪录总数将游标放到最后一页开始的位置 IF @Cursor > @Count BEGIN -- 如果最后一页与最大每次纪录数相等,返回最后整页 IF @Count % @MaxPageSize = 0 Set @Cursor = @Count - @MaxPageSize + 1 -- 否则返回最后一页剩下的纪录 ELSE Set @Cursor = @Count - (@Count % @MaxPageSize) + 1 END -- 将指针指到该页开始 Set Rowcount @Cursor -- 得到纪录开始的位置 Select @Name = tag_Name FROM [viewdatabase0716].[dbo].[view_tag] orDER BY tag_Name; -- 设置开始位置 Set Rowcount @MaxPageSize -- 得到该页纪录 Select * From [viewdatabase0716].[dbo].[view_tag] Where tag_Name >= @Name order By tag_Name Set Rowcount 0 ENDEnsuite Contrôle de pagination (... est la méthode omise de génération de code HTML) :
using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Text; /// <summary> /// 扩展连接字符串 /// </summary> public class ExStringBuilder { private StringBuilder InsertString; private StringBuilder PageString; private int PrivatePageNum = 1; private int PrivateMaxPageSize = 25; private int PrivateMaxPages = 10; private int PrivateCount; private int PrivateAllPage; public ExStringBuilder() { InsertString = new StringBuilder(""); } /// <summary> /// 得到生成的HTML /// </summary> public string GetHtml { get { return InsertString.ToString(); } } /// <summary> /// 得到生成的分页HTML /// </summary> public string GetPageHtml { get { return PageString.ToString(); } } /// <summary> /// 设置或获取目前页数 /// </summary> public int PageNum { get { return PrivatePageNum; } set { if (value >= 1) { PrivatePageNum = value; } } } /// <summary> /// 设置或获取最大分页数 /// </summary> public int MaxPageSize { get { return PrivateMaxPageSize; } set { if (value >= 1) { PrivateMaxPageSize = value; } } } /// <summary> /// 设置或获取每次显示最大页数 /// </summary> public int MaxPages { get { return PrivateMaxPages; } set { PrivateMaxPages = value; } } /// <summary> /// 设置或获取数据总数 /// </summary> public int DateCount { get { return PrivateCount; } set { PrivateCount = value; } } /// <summary> /// 获取数据总页数 /// </summary> public int AllPage { get { return PrivateAllPage; } } /// <summary> /// 初始化分页 /// </summary> public void Pagination() { PageString = new StringBuilder(""); //得到总页数 PrivateAllPage = (int)Math.Ceiling((decimal)PrivateCount / (decimal)PrivateMaxPageSize); //防止上标或下标越界 if (PrivatePageNum > PrivateAllPage) { PrivatePageNum = PrivateAllPage; } //滚动游标分页方式 int LeftRange, RightRange, LeftStart, RightEnd; LeftRange = (PrivateMaxPages + 1) / 2-1; RightRange = (PrivateMaxPages + 1) / 2; if (PrivateMaxPages >= PrivateAllPage) { LeftStart = 1; RightEnd = PrivateAllPage; } else { if (PrivatePageNum <= LeftRange) { LeftStart = 1; RightEnd = LeftStart + PrivateMaxPages - 1; } else if (PrivateAllPage - PrivatePageNum < RightRange) { RightEnd = PrivateAllPage; LeftStart = RightEnd - PrivateMaxPages + 1; } else { LeftStart = PrivatePageNum - LeftRange; RightEnd = PrivatePageNum + RightRange; } } //生成页码列表统计 PageString.Append(...); StringBuilder PreviousString = new StringBuilder(""); //如果在第一页 if (PrivatePageNum > 1) { ... } else { ... } //如果在第一组分页 if (PrivatePageNum > PrivateMaxPages) { ... } else { ... } PageString.Append(PreviousString); //生成中间页 for (int i = LeftStart; i <= RightEnd; i++) { //为当前页时 if (i == PrivatePageNum) { ... } else { ... } } StringBuilder LastString = new StringBuilder(""); //如果在最后一页 if (PrivatePageNum < PrivateAllPage) { ... } else { ... } //如果在最后一组 if ((PrivatePageNum + PrivateMaxPages) < PrivateAllPage) { ... } else { ... } PageString.Append(LastString); } /// <summary> /// 生成Tag分类表格 /// </summary> public void TagTable(ExDataRow myExDataRow) { InsertString.Append(...); }Méthode d'appel :
//得到分页设置并放入Session ExRequest myExRequest = new ExRequest(); myExRequest.PageSession("Tag_", new string[] { "page", "size" }); //生成Tag分页 ExStringBuilder Tag = new ExStringBuilder(); //设置每次显示多少条纪录 Tag.MaxPageSize = Convert.ToInt32(Session["Tag_size"]); //设置最多显示多少页码 Tag.MaxPages = 9; //设置当前为第几页 Tag.PageNum = Convert.ToInt32(Session["Tag_page"]); string[][] myNamenValue = new string[2][]{ new string[]{"MaxPageSize","PageNum","Count"}, new string[]{Tag.MaxPageSize.ToString(),Tag.PageNum.ToString()} }; //调用存储过程 DataTable myDataTable = mySQL.BatchGetDB("Tag_Page_Name_Select", myNamenValue, "Count"); Tag.DateCount = (int)mySQL.OutputCommand.Parameters["@Count"].Value; Tag.Pagination(); HeadPage.InnerHtml = FootPage.InnerHtml = Tag.GetPageHtml; for (int i = 0, j = myDataTable.Rows.Count; i < j; i++) { Tag.TagTable(new ExDataRow(myDataTable.Rows[i])); } TagBox.InnerHtml = Tag.GetHtml;La méthode de le traitement des numéros de page vers Session n'est pas fourni et ce n'est pas très gros. La méthode d'appel de la procédure stockée pour renvoyer les paramètres et les enregistrements est similaire à la méthode d'opération de données par lots que j'ai écrite auparavant. .
À l'heure actuelle, je pense qu'il y aura des défauts dans ces codes, j'attendrai le code ultérieur du projet pour le renforcer lors de la révision. Ce que je veux dire, c'est de ne pas être dérouté par ceux-ci. des choses qui traînent. Cela ne vous améliorera jamais. Faites quelque chose avec l'attitude de savoir ce qui se passe et pourquoi, l'aide pour vous-même sera évidente