基于DataGrid控件与ADO实现数据的分页显示
GridView+存储过程实现真分页
GridView+存储过程实现真分页GridView+存储过程实现'真分页',有需要的朋友可以参考下。
GridView,中的表格控件,和Repeater控件一样,在中都是很常用的两个表格控件,GridView自己也有分页功能,实现是将一张表的数据全部绑定到GridView,然后再进行分页,这就是通常我们所说的'假分页'。
在应对小数据量上完全没问题,但问题往往没有那么简单,在面对大数据量的问题上,GridView自己的分页还是力不从心,严重影响效率,用户体验也不好。
要解决这个问题,实现'真分页',就要从根上去分析,为什么'假分页'速度慢,因为它一次获取的是整张表的数据,但是最后显示的只是一页,所以,如果我们只查询需要显示的一页数据(上页下页,首页尾页,跳页都只查询需要的一页数据),在绑定到GridView中,查询分页的速度会快很多,这就是所谓的'真分页'了。
剩下的问题就是SQL语句去实现了。
经过一番查询研究,通过存储过程实现真分页效果挺好。
存储过程SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [dbo].[PROC_GridViewPage]--@TableList Varchar(200), --查询的字段,用逗号隔开@TableName Varchar(30), --查询的表名--@SelectWhere Varchar(500),--查询的条件@SelectOrderId Varchar(20), --表主键字段名@SelectOrder Varchar(200), --排序,order by 列名@intPageNo int, --页号@intPageSize int, --每页显示数@RecordCount int OUTPUT --总记录数(OUTPUT表示是存储过程输出型参数,接收方法见DAL层)ASdeclare @TmpSelect NVarchar(600) --声明变量set nocount on --关闭计数--获取表中记录总数set @TmpSelect = 'select @RecordCount = count(*) from '+@TableName+' ' --可以添加查询条件+@SelectWhereexecute sp_executesql@TmpSelect, --执行上面的sql语句N'@RecordCount int OUTPUT' , --执行输出数据的sql语句,output出总记录数@RecordCount OUTPUTif (@RecordCount = 0) --如果表中没有,则返回0return 0/*判断页数是否正确*/if (@intPageNo - 1) * @intPageSize > @RecordCount --页号大于总页数,返回错误return (-1)set nocount off--打开计数BEGINset @TmpSelect = 'select top '+str(@intPageSize)+' '+ '*' +'from '+@TableName+' where '+@SelectOrderId+' not in(select top '+str((@intPageNo-1)*@intPageSize)+' '+@SelectOrderId+' from '+@TableName+' '+@SelectOrder+') '+@SelectOrder ENDexecute sp_executesql @TmpSelectreturn(@@rowcount)GOsp_executesql?和EXEC一样在存储过程中执行sql语句的命令,平时我们见到和使用的通常是EXEC,sp_executesql的不同之出在于,它提供了一个借口,支持参数的输入和输出,灵活性更好,而且sp_executesql的执行性能更好。
GridView控件分页显示记录
GridView控件分页显示记录MasterPageFile="~/Manage/master.Master"GridView控件具有内置分页功能,设置GridView控件分页的属性如表1所示。
表1 GridView控件分页属性AllowPaging属性用于获取或设置一个值,该值指示是否启用分页功能。
如果启用分页功能,则为True,否则为False,默认值为False。
分页的形式可以显示一组称为“页导航”的控件,例如以数字显示页面链接或“首页上一页下一页最后一页”显示页面链接,用户使用这些控件可以在控件内的页面之间跳转。
GridView控件使用PagerSettings 类来表示页导航的属性。
通常情况下,PagerSettings 对象存储在控件的PagerSettings 属性中,通过设置PagerSettings 对象的属性自定义页导航。
页导航支持几种不同的显示模式。
若要指定页导航的显示模式,可以设置Mode 属性。
表2介绍了这几种不同的模式。
表2 Mode属性分页模式当Mode 属性设置为NextPrevious、NextPreviousFirstLast 或NumericFirstLast 值时,可以通过设置表3中所示的属性来为非数字按钮指定自定义文字。
表3 设置按钮文字除了在按钮上设置自定义文字外,还可以通过设置表4中所示的属性为非数字按钮显示图像。
表4设置按钮显示图像如果设置GridView控件分页显示为“首页上一页下一页最后一页”的形式,可以设置AllowPaging=True,然后在PageSettings中设置Mode的模式为NextPreviousFirstLast,每一个按钮显示的文字,相关如下所示:。
一种基于ADO Recordset技术的Web数据分页方法的改进
‘ 0ooooooooo殳 1 . ; e
3 A O e o d e 分 页方 法 的弊端 D R c rs t
利 用 A O的 R crs 对象 可 以简单方 便地实 现数据 分 D eo e dt 页 ,可是必须将所 有数据全部封 装进 R o s 对象后才 能进 c dt e re 行分 页, 如果数据量很大 , 比如超过上万 条 , 那么封装 数据就是
维普资讯
计算机 时代 2 0 年 第 3 07 期
・3 6・
一
种 于A ORcre技 基 D eo s 术的W b 据 方 的 进 dt e 数 分页 法 改
安 宁辉
( 国防大学训练部教学保障部 。北京 109) 001
摘 要 :数据分 页是基 于数据库的动 态 We b系统所必 需的技术。Mi oo 公 司的 AD Ac v a jc 数据存取技 c sf r t O( t e D t Obet i a )
0 引言
据 需要设 置 Pg ̄ z aeie属性 , 则可 以得 到 分页 总数 P gC ut ae o n ,
ae ut R c rC u t g Sz 的最 P e 随着信息技术的发展 , 人们越来越多地借助于 计算机和 网 其 中P gCon 取 大 于或 者 等于 F eod o n/ae i ] b ue g o P 就可 以返 回某一分页 络获取信 息 , 但是面对浩 如烟 海的信息 资源 , 查询结果 往往会 小 整数 。然 后设置 的数据 分页方法 , c e r ̄ 该方法 简单 易用 , 由于效率 原因, 却 不适用大数据 量的快速 定位 分页。 文章 对该方法从根本上进行 了改进 , 获得 了非常明显的效果 , 完全适 用于企业级应 用的海量数据分 页定位 。
ADO 存取数据库时的分页显示详
什么是 ADO 存取数据库时的分页显示?如果你使用过目前众多网站上的电子公告板程序的话,那你应该会知道电子公告板程序为了提高页面的读取速度,一般不会将所有的帖子全部在一页中罗列出来,而是将其分成多页显示,每页显示一定数目的帖子数,譬如 20 条。
想不想了解如何实现分页显示?请看本文!那么究竟如何才能做到将数据库的查询结果分页显示呢?其实方法有很多,但主要有两种:一、将数据库中所有符合查询条件的记录一次性的都读入 recordset 中,存放在内存中,然后通过 ADO Recordset 对象所提供的几个专门支持分页处理的属性: PageSize( 页大小 )、 PageCount( 页数目 ) 以及AbsolutePage( 绝对页 ) 来管理分页处理。
二、根据客户的指示,每次分别从符合查询条件的记录中将规定数目的记录数读取出来并显示。
两者的主要差别在于前者是一次性将所有记录都读入内存然后再根据指示来依次做判断分析从而达到分页显示的效果,而后者是先根据指示做出判断并将规定数目的符合查询条件的记录读入内存,从而直接达到分页显示的功能。
我们可以很明显的感觉到,当数据库中的记录数达到上万或更多时,第一种方法的执行效率将明显低于第二种方法,因为当每一个客户查询页面时都要将所有符合条件的记录存放在服务器内存中,然后在进行分页等处理,如果同时有超过 100 个的客户在线查询,那么 ASP 应用程序的执行效率将大受影响。
但是,当服务器上数据库的记录数以及同时在线的人数并不是很多时,两者在执行效率上是相差无几的,此时一般就采用第一种方法,因为第一种方法的 ASP 程序编写相对第二种方法要简单明了得多。
在这里作者就以我们常见的 ASP BBS 程序为例,来给大家分析一下如何在 BBS 程序里实现分页显示功能,由于我们一般使用的 BBS 程序的数据库记录数和同时访问的人数都不会太多,所以以下程序实例是使用的先前所介绍的第一种分页显示方法。
ADO对查询出的数据分页显示delphi
ADO对查询出的数据分页显示delphi(转)unit MainFrm;interfaceusesClasses, Controls, Forms, Grids, ToolWin, ComCtrls, StdCtrls, ExtCtrls, DB, ADODB;typeTfrmMain = class(TForm)cnn: TADOConnection;rst: TADODataSet;pnlNavigate: TPanel;btnFirst: TButton;btnPrior: TButton;btnNext: TButton;btnLast: TButton;edtPageNO: TEdit;sgData: TStringGrid;procedure FormCreate(Sender: TObject);procedure btnFirstClick(Sender: TObject);procedure edtPageNOKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); privateFPageNo: Integer;procedure SetPageNo(Value: Integer);publicproperty PageNo: Integer read FPageNo write SetPageNo;end;varfrmMain: TfrmMain;implementationusesWindows, SysUtils;{$R *.dfm}constPAGE_SIZE = 6;procedure TfrmMain.FormCreate(Sender: TObject);vari: Integer;beginSetWindowLong(edtPageNO.Handle,GWL_STYLE,GetWindowLong(edtPageNo.Handle, GWL_STYLE) or ES_CENTER or ES_NUMBER);rst.Active := True;rst.Recordset.PageSize := PAGE_SIZE;sgData.ColCount := rst.FieldCount + 1;for i := 0 to rst.FieldCount - 1 dobeginsgData.ColWidths[i + 1] := rst.Fields[i].DisplayWidth * Canvas.TextWidth('0');sgData.Cells[i + 1, 0] := rst.Fields[i].DisplayName;end;sgData.Cells[0, 0] := '序号';PageNo := 1;end;procedure TfrmMain.btnFirstClick(Sender: TObject);beginif Sender = btnFirst thenPageNo := 1else if Sender = btnPrior thenPageNo := PageNo - 1else if Sender = btnNext thenPageNo := PageNo + 1else PageNo := rst.Recordset.PageCount;end;procedure TfrmMain.edtPageNOKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);beginif edtPageNO.Text <> '' thenPageNo := StrToInt(edtPageNO.Text);end;procedure TfrmMain.SetPageNo(Value: Integer);constadStateOpen = $00000001;varn, i, j: Integer;beginwith rst.Recordset doif (FPageNo <> Value) and (Value >= 1) and (Value <= PageCount) and(State = adStateOpen) thenbeginFPageNo := Value;AbsolutePage := FPageNo;n := (FPageNo - 1) * PAGE_SIZE;edtPageNo.Text := IntToStr(FPageNo);for i := 1 to PAGE_SIZE dobeginsgData.RowCount := i + 1;sgData.Cells[0, i] := IntToStr(n + i);for j := 0 to Fields.Count - 1 dosgData.Cells[j + 1, i] := Fields[j].Value;MoveNext;if Eof then Exit;end;end;end;end.*************************************************************************************************************随着“金盾工程”建设的逐步深入和公安信息化的高速发展,公安计算机应用系统被广泛应用在各警种、各部门。
让DataGridView控件里的记录分页显示
让DataGridView控件里的记录分页显示让DataGridView控件里的记录分页显示 ( 2005)Public Class ClsDataGridViewPage'每页记录数Private _RowsPerPage As Integer'总页数Private _TotalPage As Integer'当前页数Private _curPage As Integer = 0'要分页的DataGridViewPrivate _DataGridView As Windows.Forms.DataGridView '与需要分页显示的的DataViewPrivate _dv As DataView'获取与设置每页记录数Public Property RowsPerPage() As IntegerGetReturn _RowsPerPageEnd GetSet(ByVal value As Integer)_RowsPerPage = valueEnd SetEnd Property'获取总页数Public ReadOnly Property TotalPage() As IntegerGetReturn _TotalPageEnd GetEnd Property'获取与设置当前页数Public Property curPage() As IntegerGetReturn _curPageEnd GetSet(ByVal value As Integer)_curPage = valueEnd SetEnd Property'设置需要分页的GetDataGridViewPublic WriteOnly Property SetDataGridView()Set(ByVal value As Object)_DataGridView = valueEnd SetEnd Property'设置需要分页显示的的DataViewPublic WriteOnly Property SetDataView()Set(ByVal value As Object)_dv = valueEnd SetEnd PropertyPublic Sub New()End Sub'重载NEW函数,在构造时就可以对成员赋值Public Sub New(ByVal datagridview As Windows.Forms.DataGridView, ByVal dv As DataView, _ByVal RowsPerPage As Integer)_DataGridView = datagridview_dv = dv_RowsPerPage = RowsPerPageEnd Sub'开始分页啦Public Sub Paging()'首先判断DataView中的记录数是否足够形成多页,'如果不能,那么就只有一页,且DataGridView需要显示的记录等同于“最后一页”的记录If _dv.Count <= _RowsPerPage Then_TotalPage = 1GoLastPage()Exit SubEnd If'可以分为多页的话就要计算总的页数咯,然后DataGridView显示第一页If _dv.Count Mod _RowsPerPage = 0 Then_TotalPage = Int(_dv.Count / _RowsPerPage)Else_TotalPage = Int(_dv.Count / _RowsPerPage) + 1End IfGoFirstPage()End Sub'到第一页Public Sub GoFirstPage()'如果只有一页,那么显示的记录等同于“最后一页”的记录 If _TotalPage = 1 ThenGoLastPage()Exit SubEnd If'如果有多页,就到第“1”页_curPage = 0GoNoPage(_curPage)End SubPublic Sub GoNextPage()'这段代码主要是为了防止当前页号溢出_curPage += 1If _curPage > _TotalPage - 1 Then_curPage = _TotalPage - 1Exit SubEnd If'如果到了最后一页,那就显示最后一页的记录If _curPage = _TotalPage - 1 ThenGoLastPage()Exit SubEnd If'如果没到最后一页,就到指定的“下一页”GoNoPage(_curPage)End SubPublic Sub GoPrevPage()'防止不合法的当前页号_curPage -= 1If _curPage < 0 Then_curPage = 0Exit SubEnd If'到指定的“上一页”GoNoPage(_curPage)End Sub'到最后一页Public Sub GoLastPage()_curPage = _TotalPage - 1Dim i As IntegerDim dt As New DataTable'dt只是个临时的DataTable,用来获取所需页数的记录dt = _dv.ToTable.CloneFor i = (_TotalPage - 1) * _RowsPerPage To _dv.Count - 1'i值上下限很关键,调试的时候常常这里报错找不到行'就是因为i值溢出Dim dr As DataRow = dt.NewRowdr.ItemArray = _dv.ToTable.Rows(i).ItemArraydt.Rows.Add(dr)Next_DataGridView.DataSource = dtEnd Sub'到指定的页Public Sub GoNoPage(ByVal PageNo As Integer)_curPage = PageNo'防止不合法的页号If _curPage < 0 ThenMsgBox("页号不能小于1")Exit SubEnd If'防止页号溢出If _curPage >= _TotalPage ThenMsgBox("页号超出上限")Exit SubEnd If'如果页号是最后一页,就显示最后一页If _curPage = _TotalPage - 1 ThenGoLastPage()Exit SubEnd If'不是最后一页,那显示指定页号的页Dim dt As New DataTabledt = _dv.ToTable.CloneDim i As IntegerFor i = PageNo * _RowsPerPage To (PageNo + 1) * _RowsPerPage - 1Dim dr As DataRow = dt.NewRowdr.ItemArray = _dv.ToTable.Rows(i).ItemArraydt.Rows.Add(dr)Next_DataGridView.DataSource = dtEnd SubEnd Class现在举例介绍一下怎么使用这个类(以下简称分页辅助类)来帮助DataGridView控件分页显示记录:首先,在DataGridView所在的窗体类代码中加入该分页辅助类的成员:Private dgvPage As ClsDataGridViewPage然后在窗体的构造函数代码中实例化这个成员:Public Sub New()' 此调用是 Windows 窗体设计器所必需的。
DataGridView使用自定义控件实现简单分页功能(推荐)
DataGridView使⽤⾃定义控件实现简单分页功能(推荐)本例⼦使⽤⾃定义控件⽅法实现,数据库使⽤的是SQL Server,实现过程如下:1、新建⼀个⾃定义控件,命名为:PageControl。
2、PageControl代码如下:public partial class PageControl : UserControl{//委托及事件public delegate void BindPage(int pageSize, int pageIndex, out int totalCount);public event BindPage BindPageEvent;//属性public int PageSize { get; set; } = 1; //每页显⽰记录数public int PageIndex { get; set; } //页序号public int TotalCount { get; set; } //总记录数public int PageCount { get; set; } //总页数public PageControl(){InitializeComponent();//取消下划线linkFirst.LinkBehavior = LinkBehavior.NeverUnderline;linkPrev.LinkBehavior = LinkBehavior.NeverUnderline;linkNext.LinkBehavior = LinkBehavior.NeverUnderline;linkLast.LinkBehavior = LinkBehavior.NeverUnderline;linkGo.LinkBehavior = LinkBehavior.NeverUnderline;}/// <summary>/// 设置页/// </summary>public void SetPage(){//总记录数int totalCount = 0;BindPageEvent(PageSize, PageIndex + 1, out totalCount);TotalCount = totalCount;//总页数if (TotalCount % PageSize == 0)PageCount = TotalCount / PageSize;elsePageCount = TotalCount / PageSize + 1;//当前页及总页数txtCurrentPage.Text = (PageIndex + 1).ToString();lblTotalPage.Text = "共 " + PageCount.ToString() + " 页";}/// <summary>/// ⾸页/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void linkFirst_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e){if (e.Button == MouseButtons.Left){PageIndex = 0;SetPage();}}/// <summary>/// 上⼀页/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void linkPrve_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e){if (e.Button == MouseButtons.Left){PageIndex--;if (PageIndex < 0){PageIndex = 0;}SetPage();}}/// <summary>/// 下⼀页/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void linkNext_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e){if (e.Button == MouseButtons.Left){PageIndex++;if (PageIndex > PageCount - 1){PageIndex = PageCount - 1;}SetPage();}}/// <summary>/// 末页/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void linkLast_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e){if (e.Button == MouseButtons.Left){PageIndex = PageCount - 1;SetPage();}}/// <summary>/// 只能按0-9、Delete、Enter、Backspace键/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void txtSetPage_KeyPress(object sender, KeyPressEventArgs e){if ((e.KeyChar >= 48 && e.KeyChar <= 57) || e.KeyChar == 8 || e.KeyChar == 13 || e.KeyChar == 127){e.Handled = false;if (e.KeyChar == 13){Go();}}else{e.Handled = true;}}/// <summary>/// 指定页/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void linkGo_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e){if (e.Button == MouseButtons.Left){Go();}}private void Go(){if (string.IsNullOrEmpty(txtCurrentPage.Text)){MessageBox.Show("指定页不能为空。
如何用DataGrid实现分页?
如何用DataGrid实现分页?见下代码:<%@ Import Namespace="System.Data" %><html><script language="C#" runat="server">ICollection CreateDataSource() {DataTable dt = new DataTable();DataRow dr;dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32))); dt.Columns.Add(new DataColumn("StringValue", typeof(string))); dt.Columns.Add(new DataColumn("DateTimeValue", typeof(string))); dt.Columns.Add(new DataColumn("BoolValue", typeof(bool)));for (int i = 0; i < 200; i++) {dr = dt.NewRow();dr[0] = i;dr[1] = "Item " + Int32.ToString(i);dr[2] = DateTime.Now.ToShortDateString();dr[3] = (i % 2 != 0) ? true : false;dt.Rows.Add(dr);}DataView dv = new DataView(dt);return dv;}void Page_Load(Object sender, EventArgs e) {if (chk1.Checked) {MyDataGrid.PagerStyle.Mode=PagerMode.NumericPages;}else {MyDataGrid.PagerStyle.Mode=PagerMode.NextPrev;}BindGrid();}void MyDataGrid_Page(Object sender, DataGridPageChangedEventArgs e) { BindGrid();}void BindGrid() {MyDataGrid.DataSource = CreateDataSource();MyDataGrid.DataBind();ShowStats();}void ShowStats() {lblCurrentIndex.Text = "CurrentPageIndex is " + MyDataGrid.CurrentPageIndex; lblPageCount.Text = "PageCount is " + MyDataGrid.PageCount;}</script><body><font face="Verdana">精彩春风之DataGrid基本页面</font><form runat=server><ASP:DataGrid id="MyDataGrid" runat="server"AllowPaging="True"PageSize="10"PagerStyle-Mode="NumericPages"PagerStyle-HorizontalAlign="Right"PagerStyle-NextPageText="下一页"PagerStyle-PrevPageText="上一页"OnPageIndexChanged="MyDataGrid_Page"BorderColor="black"BorderWidth="1"GridLines="Both"CellPadding="3"CellSpacing="0"Font-Name="Verdana"Font-Size="8pt"HeaderStyle-BackColor="#aaaadd" AlternatingItemStyle-BackColor="#eeeeee"/><p><asp:Checkbox id="chk1" runat="server"Text="页面数字导航按钮"Font-Name="Verdana"Font-Size="8pt"AutoPostBack="true"/><p><table bgcolor="#eeeeee" cellpadding="6"><tr><td nowrap> <font face="Verdana" size="-2"><asp:Label id="lblCurrentIndex" runat="server" /><br><asp:Label id="lblPageCount" runat="server" /><br></font></td></tr></table></form></body></html>。
实现DataGridview中的分页显示
数据库存储过程分页与SQL调用CREATE PROCEDURE [dbo].[Pagination]@Columns VARCHAR(500),-- The columns to be displayed, divide by comma @Tablename VARCHAR(100),-- The name of the table to be searched@OrderColumnName VARCHAR(100),-- The name of the column to be used in order@Order VARCHAR(50),-- The order method, ASC or DESC@Where VARCHAR(100),-- The where condition, if there is not conditon use 1=1@PageIndex INT,-- Current page index@PageSize INT,-- The size of the page@PageCount INT OUTPUT-- The total page count,define as output parameter ASBEGINDECLARE@SqlRecordCount NVARCHAR(100)-- The SQL Statement to get the total count of the recordsDECLARE @SqlSelect NVARCHAR(1000)-- The SQL SELECT statmentSET@SqlRecordCount =N'SELECT @RecordCount = COUNT(*) FROM '+@Tablename +' WHERE '+@WhereDECLARE @RecordCount INTEXEC sp_executesql @SqlRecordCount, N'@RecordCount INTOUTPUT',@RecordCount OUTPUT-- Transfer the parameter dynamicIF(@RecordCount % @PageSize = 0)SET @PageCount = @RecordCount / @PageSizeELSESET @PageCount = @RecordCount / @PageSize + 1SET@SqlSelect =N'SELECT '+@Columns +' FROM(SELECT ROW_NUMBER() OVER (ORDER BY '+ @OrderColumnName+' '+ @Order +') AS tempid, * FROM '+ @Tablename +' WHERE '+ @Where +') AS tempTableName WHERE tempid BETWEEN '+STR((@PageIndex - 1)*@PageSize + 1)+' AND '+STR(@PageIndex * @PageSize)EXEC(@SqlSelect)END程序有3个控件BindingNavigator:就是DataGridView控件上面的那个,在工程里名字:bindngrDemo DataGridView: dgvDemoBindingSource: 这个其实可以不要bindseDemousing System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Collections;using System.Data.SqlClient;using System.Configuration;namespace FeiTianSeo{public partial class Test1 : Form{static int pageSize = 20;static int pageCount = 0;public Test1(){InitializeComponent();}public static string connectionString = ConfigurationManager.ConnectionStrings["conn"].ToString();private void Test1_Load(object sender, EventArgs e) {LoadData(1, dgvDemo);// Set the status of the BindingNavigator controlif (pageCount == 0 || pageCount == 1){bindngrDemo.MoveFirstItem.Enabled = false;bindngrDemo.MoveLastItem.Enabled = false;bindngrDemo.MoveNextItem.Enabled = false;bindngrDemo.MovePreviousItem.Enabled = false;}else{bindngrDemo.MoveFirstItem.Enabled = false;bindngrDemo.MoveLastItem.Enabled = true;bindngrDemo.MoveNextItem.Enabled = true;bindngrDemo.MovePreviousItem.Enabled = false;bindngrDemo.PositionItem.Text = "1";bindngrDemo.CountItem.Text = "共{" + pageCount.ToString() + "}页";}}private static SqlCommand GenerateSelectCommand(string Columns, string tableName, string orderColumnName, string order, string whereCondition,int pageIndex, int pageSize, SqlConnection conn){SqlCommand sqlcmd = new SqlCommand("Pagination", conn);调用存储过程计算求分页数 mandType = CommandType.StoredProcedure;sqlcmd.Parameters.AddWithValue("@Columns", Columns);sqlcmd.Parameters.AddWithValue("@Tablename", tableName);sqlcmd.Parameters.AddWithValue("@OrderColumnName", orderColumnName);sqlcmd.Parameters.AddWithValue("@Order", order);sqlcmd.Parameters.AddWithValue("@Where", whereCondition);sqlcmd.Parameters.AddWithValue("@PageIndex", pageIndex);sqlcmd.Parameters.AddWithValue("@PageSize", pageSize);SqlParameter pageCount = new SqlParameter("@PageCount", SqlDbType.Int);pageCount.Direction = ParameterDirection.Output;sqlcmd.Parameters.Add(pageCount);sqlcmd.UpdatedRowSource = UpdateRowSource.None;return sqlcmd;}private static void LoadData(int pageIndex, DataGridView dgvDemo){//string strConn = "server = (local); Database = pubs; Integrated Security = SSPI";try{using (SqlConnection conn = new SqlConnection(connectionString)){conn.Open();SqlDataAdapter sqlDa = new SqlDataAdapter();sqlDa.SelectCommand = GenerateSelectCommand("id, UserName, linkAdress","Links", "id", "ASC", "1=1", pageIndex, pageSize, conn);DataTable ds = new DataTable();sqlDa.Fill(ds);调用存储过程计算求分页数pageCount = (int)sqlDa.SelectCommand.Parameters["@PageCount"].Value;BindingSource bindseDemo = new BindingSource();bindseDemo.DataSource = ds;dgvDemo.DataSource = bindseDemo;sqlDa.Dispose();// Use SqlDataAdapter Dataset to fetch the data/*DataSet ds = new DataSet();SqlDataAdapter sqlDa = new SqlDataAdapter();sqlDa.SelectCommand = GenerateSelectCommand("fname", "employee", "fname","ASC", "1=1", pageIndex, pageSize, conn);sqlDa.Fill(ds);pageCount = (int)sqlDa.SelectCommand.Parameters["@PageCount"].Value; dgvDemo.DataSource = ds.Tables[0];sqlDa.Dispose();*/conn.Close();}}catch (Exception ex){MessageBox.Show(ex.Message, "Information:", MessageBoxButtons.OK,rmation);}}private void button1_Click(object sender, EventArgs e){//string sqlstr = "select * from Links";//SqlConnection conn = new SqlConnection(connectionString);//DataSet ds = new DataSet();//SqlDataAdapter ada = new SqlDataAdapter(sqlstr, conn);//ada.Fill(ds);//this.dgvDemo.DataSource = ds.Tables[0];}private void bindingNavigatorMoveNextItem_Click_1(object sender, EventArgs e){int currentPage = Convert.ToInt32(bindngrDemo.PositionItem.Text);if (currentPage < pageCount){int page = currentPage + 1;bindngrDemo.PositionItem.Text = page.ToString();LoadData(page, dgvDemo);if (page == pageCount){bindngrDemo.MoveNextItem.Enabled = false;bindngrDemo.MoveLastItem.Enabled = false;}if (page >= 2){bindngrDemo.MovePreviousItem.Enabled = true;bindngrDemo.MoveFirstItem.Enabled = true;}}else{MessageBox.Show("This is the last page", "Information", MessageBoxButtons.OK, rmation);}}private void bindingNavigatorMoveLastItem_Click_1(object sender, EventArgs e){LoadData(pageCount, dgvDemo);bindngrDemo.PositionItem.Text = pageCount.ToString();bindngrDemo.MoveLastItem.Enabled = false;bindngrDemo.MoveNextItem.Enabled = false;bindngrDemo.MovePreviousItem.Enabled = true;bindngrDemo.MoveFirstItem.Enabled = true;}private void bindingNavigatorMovePreviousItem_Click_1(object sender, EventArgs e){int currentPage = Convert.ToInt32(bindngrDemo.PositionItem.Text);if (currentPage >= 2){int page = currentPage - 1;bindngrDemo.PositionItem.Text = page.ToString();LoadData(page, dgvDemo);if (page == 1){bindngrDemo.MovePreviousItem.Enabled = false;bindngrDemo.MoveFirstItem.Enabled = false;}if (page <= pageCount){bindngrDemo.MoveNextItem.Enabled = true;bindngrDemo.MoveLastItem.Enabled = true;}}else{MessageBox.Show("This is the first page", "Information", MessageBoxButtons.OK, rmation);}}private void bindingNavigatorMoveFirstItem_Click_1(object sender, EventArgs e){LoadData(1, dgvDemo);bindngrDemo.PositionItem.Text = "1";bindngrDemo.MoveFirstItem.Enabled = false;bindngrDemo.MovePreviousItem.Enabled = false;bindngrDemo.MoveNextItem.Enabled = true;bindngrDemo.MoveLastItem.Enabled = true;}}}。
ADO对查询出的数据分页显示delphi
ADO对查询出的数据分页显示delphiADO对查询出的数据分页显示delphi(转)unit MainFrm;interfaceusesClasses, Controls, Forms, Grids, ToolWin, ComCtrls, StdCtrls, ExtCtrls, DB, ADODB;typeTfrmMain = class(TForm)cnn: TADOConnection;rst: TADODataSet;pnlNavigate: TPanel;btnFirst: TButton;btnPrior: TButton;btnNext: TButton;btnLast: TButton;edtPageNO: TEdit;sgData: TStringGrid;procedure FormCreate(Sender: TObject);procedure btnFirstClick(Sender: TObject);procedure edtPageNOKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); privateFPageNo: Integer;procedure SetPageNo(Value: Integer);publicproperty PageNo: Integer read FPageNo write SetPageNo;end;varfrmMain: TfrmMain;implementationusesWindows, SysUtils;{$R *.dfm}constPAGE_SIZE = 6;procedure TfrmMain.FormCreate(Sender: TObject);vari: Integer;beginSetWindowLong(edtPageNO.Handle,GWL_STYLE,GetWindo wLong(edtPageNo.Handle, GWL_STYLE) or ES_CENTER or ES_NUMBER);rst.Active := True;rst.Recordset.PageSize := PAGE_SIZE;sgData.ColCount := rst.FieldCount + 1;for i := 0 to rst.FieldCount - 1 dobeginsgData.ColWidths[i + 1] := rst.Fields[i].DisplayWidth * Canvas.TextWidth('0');sgData.Cells[i + 1, 0] := rst.Fields[i].DisplayName;end;sgData.Cells[0, 0] := '序号';PageNo := 1;end;procedure TfrmMain.btnFirstClick(Sender: TObject);beginif Sender = btnFirst thenPageNo := 1else if Sender = btnPrior thenPageNo := PageNo - 1else if Sender = btnNext thenPageNo := PageNo + 1else PageNo := rst.Recordset.PageCount;end;procedure TfrmMain.edtPageNOKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);beginif edtPageNO.T ext <> '' thenPageNo := StrT oInt(edtPageNO.Text);end;procedure TfrmMain.SetPageNo(Value: Integer);constadStateOpen = $00000001;varn, i, j: Integer;beginwith rst.Recordset doif (FPageNo <> Value) and (Value >= 1) and (Value <= PageCount) and(State = adStateOpen) thenbeginFPageNo := Value;AbsolutePage := FPageNo;n := (FPageNo - 1) * PAGE_SIZE;edtPageNo.Text := IntToStr(FPageNo);for i := 1 to PAGE_SIZE dobeginsgData.RowCount := i + 1;sgData.Cells[0, i] := IntToStr(n + i);for j := 0 to Fields.Count - 1 dosgData.Cells[j + 1, i] := Fields[j].Value;MoveNext;if Eof then Exit;end;end;end;end.*************************************************************** **********************************************随着“金盾工程”建设的逐步深入和公安信息化的高速发展,公安计算机应用系统被广泛应用在各警种、各部门。
让DataGridView控件里的记录分页显示
让DataGridView控件里的记录分页显示一、数据准备二、分页逻辑实现记录分页显示的核心逻辑是将数据按照每页显示的记录数量进行切割,然后根据用户的操作加载不同的数据页。
下面是一个简单的分页逻辑示例:1.定义分页相关的变量:```csharpint pageSize = 10; // 每页显示的记录数量int totalPages = (data.Count + pageSize - 1) / pageSize; // 总页数``````csharpList<Record> currentPageData = data.Skip((currentPage - 1) * pageSize).Take(pageSize).ToList(;dataGridView.DataSource = currentPageData;``````csharpprivate void PreviousButton_Click(object sender, EventArgs e) if (currentPage > 1)currentPage--;LoadPageData(;}private void NextButton_Click(object sender, EventArgs e)if (currentPage < totalPages)currentPage++;LoadPageData(;}```三、界面设计四、性能优化在虚拟模式下,DataGridView控件只维护当前可见区域的数据,并在需要显示时动态加载数据。
可以通过实现DataGridView控件的CellValueNeeded事件来实现懒加载和虚拟模式。
具体实现方法超出了本文的范围,但是可以在MSDN文档或者各种技术论坛上找到详细的教程和示例。
总结:。
ado 纪录集分页法原理
ado 纪录集分页法原理
ADO(ActiveX Data Objects)是一种用于访问和操作数据库的COM组件。
纪录集分页法是一种用于在数据库中分页检索数据的方法。
它的原理是通过对查询结果进行分页,以便在用户界面上显示大量数据时能够更高效地加载和显示数据。
在ADO中,纪录集分页法的原理包括以下几个步骤:
1. 查询数据库,首先,用户发起一个查询请求,ADO会将这个查询请求发送到数据库服务器。
2. 数据库处理,数据库服务器接收到查询请求后,会执行查询操作,并返回符合条件的数据集。
3. 数据分页,ADO会根据用户指定的每页显示的记录数和当前页码,对返回的数据集进行分页处理,只返回当前页需要显示的记录。
4. 数据传输,分页处理后的数据会被传输到用户界面,供用户查看和操作。
纪录集分页法的原理是通过对数据进行分页处理,从而减少数据传输量和提高数据显示效率。
这种方法可以在处理大量数据时提高系统的响应速度,同时减少对网络和服务器资源的占用。
除了以上的原理,纪录集分页法还涉及到一些技术细节,比如如何处理分页时可能出现的数据重复或遗漏,以及如何处理用户翻页操作时的数据加载和刷新等问题。
针对不同的数据库类型和查询需求,纪录集分页法的实现方式也会有所不同,需要根据具体情况进行调整和优化。
总的来说,纪录集分页法通过对查询结果进行分页处理,可以更高效地加载和显示大量数据,是数据库应用中常用的优化技术之一。
希望这个回答能够满足你的需求,如果你还有其他问题,请随时提出。
使用ListView控件和DataPager实现数据分页显示
为什么使用地方式实现分页显示?提供地诸多数据绑定控件,每一种都有它自己地优点和缺点.如果需要对数据进行操作,如果数据量不大地情况下,和是最好地选择,但是他们会生产额外地<><><><>标签.如果只是罗列出来一些简单地数据,出于对性能地考虑,必然是首选.当然和地组合必将是开发中地黄金组合,无论从性能上和功能实现上都是很棒地控件.个人收集整理勿做商业用途扩展性强,灵活度高:控件集成了、、和控件地所有功能.它可以像控件那样,让我们在控件内写任何代码.个人收集整理勿做商业用途中给我们提供地新数据绑定控件和,可以说,就是和地结合体,它既有控件地开放式模板,又具有控件地编辑特性. 这绝对是一个可以引起你兴趣地好东东,因为它给你提供了比丰富得多地布局手段,同时又具有地所有特性.个人收集整理勿做商业用途具有分页功能:控件本身并不提供分页功能,但是我们可以通过另一个控件–来实现分页地特性. 把分页地特性单独放到另一个控件里,会给我们带来很多好处,比如说可以让别地控件使用它,又比如说我们可以把它放在页面地任何地方.实质上,就是一个扩展分页功能地控件.个人收集整理勿做商业用途控件是用来显示数据地,它地使用类似于控件. 控件中有多模板,出示如下:···········它有很多地模板. 其中有许多新增地模板,如和.但我一般常用地就是,,,这几个.继续摸索这个控件后,我发现它可以让你在它地模板内写任何标记或控件,这将给我们带来很大地自由度.用显示数据开始,你可以把当作是来使用,也就是说它是模板驱动型地控件. 参考如下示例:个人收集整理勿做商业用途< "" """"个人收集整理勿做商业用途"" ""个人收集整理勿做商业用途"""" "">个人收集整理勿做商业用途<>< "">< ""><("")><>< ""><("")><>< "">< "" "" '<("")>'><><>个人收集整理勿做商业用途< "">< "" "" "" >更新<>个人收集整理勿做商业用途< "" "" "" >取消<>个人收集整理勿做商业用途<><><><>< "">< ""><("")><>< ""><("")><>< ""><("")><>< "">< "" "" "" >编辑<>个人收集整理勿做商业用途< "" "" "" >删除<>个人收集整理勿做商业用途<><><><>< " ">< ""><("")><>< ""><("")><>< ""><("")><>< "">< "" "" "" >编辑<>个人收集整理勿做商业用途< "" "" "" >删除<>个人收集整理勿做商业用途<><><><>增加分页功能如果你想为增加分页功能地话,那么就需要使用控件了.这个分页控件是一个独立地控件,你可以把它放到页面地任何位置,然后使其联到你地控件就可以完成分页地工作了.该分页控件所呈现出来地标记为内联()元素,所以如果你想精确地设置其位置地话,可以参考下面地代码,为其包裹一个< >标记. 个人收集整理勿做商业用途给控件添加以下属性,在翻页时给控件绑定新地页面索引:""个人收集整理勿做商业用途你可以像下面这样设置分页控件,并可以把其放到页面地任何位置.< "" "" "">个人收集整理勿做商业用途<>< "" 个人收集整理勿做商业用途"" ""个人收集整理勿做商业用途"" ><><>通过上面地代码你会发现,我们可以通过设置控件地,从而达到手动设置分页布局地目地. 另外还有一个关键点,就是控件地属性,你需要把它设置为地.个人收集整理勿做商业用途当然你也可以把控件放到布局模板内.把分页功能作为一个单独地控件分离出来是一个非常好地注意–它会让我们有更多地布局和显示上地自由度.但是,目前地分页控件还是有其局限性地. 它只能结合控件一起工作–如果能用在或上就更好了.另外,它也是要依赖于地.还有,现在地控件没有分页事件,也没有属性.还有一点需要注意地是,没有内置排序功能.个人收集整理勿做商业用途。
利用ListView控件和DataPager实现数据分页显示
利用ListView数据绑定控件和DataPager实现数据分页显示什么缘故利用ListView+DataPager的方式实现分页显示?提供的诸多数据绑定控件,每一种都有它自己的优势和缺点。
若是需要对数据进行操作,若是数据量不大的情形下,DataList和GridView是最好的选择,可是他们会生产额外的<table><tr><tbody><td>标签。
若是只是罗列出来一些简单的数据,出于对性能的考虑,repeater必然是首选。
固然ListView和DataPager 的组合必将是开发中的黄金组合,无论从性能上和功能实现上都是很棒的控件。
扩展性强,灵活度高:ListView控件集成了DataGrid、DataList、Repeater和GridView控件的所有功能。
它能够像Repeater控件那样,让咱们在控件内写任何HTML代码。
.NET 中给咱们提供的新数据绑定控件ListView和DataPager,能够说,ListView确实是DataGrid和 Repeater的结合体,它既有Repeater控件的开放式模板,又具有DataGrid控件的编辑特性。
这绝对是一个能够引发你爱好的好东东,因为它给你提供了比DataGird丰硕得多的布局手腕,同时又具有DataGrid的所有特性。
具有分页功能: ListView控件本身并非提供分页功能,可是咱们能够通过另一个控件–DataPager来实现分页的特性。
把分页的特性单独放到另一个控件里,会给咱们带来很多益处,比如说能够让别的控件利用它,又比如说咱们能够把它放在页面的任何地址。
实质上,DataPager 确实是一个扩展ListView分页功能的控件。
ListView控件ListView是用来显示数据的,它的利用类似于Repeater控件。
ListView控件中有n多模板,出示如下:·LayoutTemplate·ItemTemplate·AlternatingItemTemplate·SelectedItemTemplate·EmptyItemTemplate·EmptyDataTemplate·ItemSeparatorTemplate·GroupTemplate·GroupSeparatorTemplate·EditItemTemplate·InsertItemTemplate它有很多的模板。
基于ASP.NET的自定义分页显示数据库分页
基于的⾃定义分页显⽰数据库分页基于的⾃定义分页显⽰数据库分页2008-12-04 14:00摘要:本⽂针对WEB数据库记录的显⽰问题,⽤实例讨论了在框架下使⽤ 摘要DataGrid控件对数据库记录的⼀种⾃定义分页显⽰。
关键词:WEB数据库;;DataGrid;分页关键词引⾔在⽤户进⾏数据查询时通常有这样的情况,⼀个数据库查询将返回太多的⾏,⼀致不能在⼀页中显⽰。
如果⽤户正在使⽤⼀个慢的链接,发送特别⼤的数据结果可能要花很长的时间。
⼀旦获得了数据,⽤户可能发现它不包含正确的内容,或者查询范围太⼤,没有容易的办法检查完所有的结果来找到重要的信息。
因此,对查询结果分页显⽰将为⽤户可管理的数据查询提供极⼤的⽅便。
分页显⽰是⼀种⾮常常见的浏览和显⽰⼤量数据的⽅法,属于web编程中最常处理的事件之⼀,现在⽹站基本上都提供了分页显⽰信息的功能,但⼤部分还是基于ASP的,⽽.NET平台框架是针对各种各样的Web应⽤设计的,因此本⽂讨论了⼀种在 框架下实现查询记录⾃定义分页显⽰的技术。
.NET是通过平台独⽴的数据描述⽅法(通过XML)和通⽤的访问媒介Internet来简化⽤户访问和存储信息的过程。
是框架的核⼼元素,是⼀项基于服务器的强⼤技术,利⽤它,可以为WWW站点或企业内部⽹创建动态可以交互的 HTML页⾯。
完全基于模块和组件,具有很好的可扩展性和可定制性。
它主要包括WebForm和WebService两种编程模式。
前者为⽤户提供功能强⼤、外观丰富的基于表单(Form)的可编程Web页⾯;后者通过对HTTP、XML、SOAP、WSDL等Internet标准的⽀持提供在异构⽹络环境下获取远程服务、链接远程设备、交互远程应⽤的编程界⾯。
通过链接、操纵数据源在Microsoft公司推出开放式数据库互连(ODBC)应⽤程序编程接⼝(API)以来,出现了各种各样的数据库访问技术,⽽直到出现,API才能实时地给出处理效果。
Winform+ADO.Net实现分页查询
Winform+实现分页查询使⽤ + 存储过程,在winform⾥实现分页查询的功能。
实现思路:1. 使⽤存储过程,根据查询条件,查出若⼲个表;2. 返回DataSet,再去读取DataSet的Table。
以⼀个超市管理系统⾥⾯登录⽇志的查询为例,做⽰例代码。
数据库表结构⼀部分测试数据:存储过程编写1if exists(select * from sysobjects where name='usp_LoginLogsPagingQuery')2 drop procedure usp_LoginLogsPagingQuery3 go45 create procedure usp_LoginLogsPagingQuery6 @PageSize int,--每页显⽰数据⾏数7 @RecordCount int,8 @BegainTime dateTime,9 @EndTime dateTime10as11 declare @CurrentPage int=1--当前页数12 declare @Temp int= @PageSize*(@CurrentPage-1)13while (@Temp<=@RecordCount)14 Begin15select Top (@PageSize) LoginId,LoginName, ServerName,LoginTime,ExitTime from LoginLogs16where LoginId not in (select Top (@Temp) LoginId from LoginLogs where LoginTime between @BegainTime and @EndTime order by LoginTime ASC) and LoginTime between @BegainTime and @EndTime order by LoginTime ASC 17set @CurrentPage=@CurrentPage+118set @Temp = @PageSize*(@CurrentPage-1)19 End20 goView CodeSQLHelper1public static DataSet GetDataSetByProcedure(string storedProcdureName, SqlParameter[] parameters)2 {3 SqlConnection conn = new SqlConnection(connString);4 SqlCommand cmd = new SqlCommand(storedProcdureName, conn);5 mandType = CommandType.StoredProcedure;6 SqlDataAdapter da = new SqlDataAdapter(cmd);7 DataSet ds = new DataSet();8try9 {10 conn.Open();11 cmd.Parameters.AddRange(parameters);1213 da.Fill(ds);14return ds;15 }16catch (Exception ex)17 {18throw new Exception("DAL-GetDataSet带参数⽅法发⽣错误:" + ex.Message);19 }20finally21 {22 conn.Close();23 }24 }View Code相关实体类using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Models{public class LoginLogPageQuery{public DateTime BeginTime { get; set; }public DateTime EndTime { get; set; }public int CurrentPage { get; set; }public int PageSize { get; set; }public int RecordCount { get; set; }public int PageCount { get; set; }}}View Code数据分页服务:DataPageQueryService1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;6using Models;7using System.Data.SqlClient;8using System.Data;910namespace DAL11 {12public class DataPageQueryService13 {14///<summary>15///使⽤存储过程分页查询LoginLogs16///</summary>17///<param name="objLog"></param>18///<returns></returns>19public DataSet GetLoginLogPageQuery(LoginLogPageQuery objLog)20 {21 SqlParameter[] parameters = new SqlParameter[]22 {23new SqlParameter("@PageSize",objLog.PageSize),24new SqlParameter("@RecordCount",objLog.RecordCount),25new SqlParameter("@BeginTime",objLog.BeginTime),26new SqlParameter("@EndTime",objLog.EndTime)27 };2829try30 {31return SQLHelper.GetDataSetByProcedure("usp_LoginLogsPagingQuery",parameters);32 }33catch (Exception ex)34 {35throw new Exception(ex.Message);36 }37 }3839///<summary>40///查询总数据量41///</summary>42///<param name="objLog"></param>43///<returns></returns>44public int GetRecordCount(LoginLogPageQuery objLog)45 {46string sql = "select count(*) from Loginlogs where LoginTime between @BeginTime and @EndTime";47 SqlParameter[] parameters = new SqlParameter[]48 {49new SqlParameter("@BeginTime",objLog.BeginTime),50new SqlParameter("@EndTime",objLog.EndTime)51 };52try53 {54return Convert.ToInt32(SQLHelper.GetSingleResult(sql,parameters));55 }56catch (Exception ex)57 {58throw new Exception(ex.Message);59 }60 }6162 }63 }View Code数据分页业务逻辑:LoginLogPageQueryManagerusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using DAL;using Models;using System.Data;namespace BLL{public class LoginLogPageQueryManager{private DataPageQueryService objPageQuery = new DataPageQueryService();public DataSet GetLoginLogPageQueryDS(LoginLogPageQuery objLog){return objPageQuery.GetLoginLogPageQuery(objLog);}public int GetRecordCount(LoginLogPageQuery objLog){return objPageQuery.GetRecordCount(objLog);}}}View Code显⽰界⾯各按钮事件1using System;2using System.Collections.Generic;3using ponentModel;4using System.Data;5using System.Drawing;6using System.Linq;7using System.Text;8using System.Windows.Forms;9using Models;10using BLL;1112namespace SMManager13 {14public partial class FrmLogQuery : Form15 {16private DataSet objDS = new DataSet();17private LoginLogPageQueryManager objPageQuery = new LoginLogPageQueryManager();18private LoginLogPageQuery objLog = null;19public FrmLogQuery()20 {21 InitializeComponent();2223this.cboPageSize.SelectedIndex = 0;24this.dgvLogs.AutoGenerateColumns = false;25 }26//提交查询27private void btnQuery_Click(object sender, EventArgs e)28 {29 objLog = new LoginLogPageQuery()30 {31 PageSize = Convert.ToInt32(this.cboPageSize.Text),32 BeginTime = Convert.ToDateTime(this.dtpStart.Text),33 EndTime = Convert.ToDateTime(this.dtpEnd.Text).AddDays(1.0)34 };35try36 {37//获取数据总量38 objLog.RecordCount = objPageQuery.GetRecordCount(objLog);39//获取分页DataSet40 objDS = objPageQuery.GetLoginLogPageQueryDS(objLog);41this.dgvLogs.DataSource = objDS.Tables[objLog.CurrentPage];42 }43catch (Exception ex)44 {45 MessageBox.Show("数据库发⽣错误,请检查连接或联系管理员!","错误提⽰");46new ErrorLogManager().ErrorLog(new ErrorLog()47 {48 LoginId = Program.objCurrentAdmin.LoginId,49 Operate=Operate.ErrorHappenedWhenLoginLogPageQuery,50 ErrorMessage=ex.Message51 });52return;53 }5455//计算当前页56this.lblCurrentPage.Text = (objLog.CurrentPage + 1).ToString();57//计算总页数58int pageCount = objLog.RecordCount / objLog.PageSize;59 objLog.PageCount = objLog.RecordCount % objLog.PageSize == 0 ? pageCount : pageCount + 1; 60this.lblPageCount.Text = objLog.PageCount.ToString();6162if (objLog.PageCount == 0)63 {64 MessageBox.Show("该查询下⽆数据!", "查询提⽰");65return;66 }67//所有按钮开启68this.btnFirst.Enabled = true;69this.btnNext.Enabled = true;70this.btnPrevious.Enabled = true;71this.btnLast.Enabled = true;72this.btnGoTo.Enabled = true;73//关闭不需要的按钮74if (objLog.PageCount == 1)75 {76this.btnFirst.Enabled = false;77this.btnNext.Enabled = false;78this.btnPrevious.Enabled = false;79this.btnLast.Enabled = false;80this.btnGoTo.Enabled = false;81 }82 }83//显⽰⾏号84private void dgvLogs_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)85 {86 DataGridViewStyle.DgvRowPostPaint(this.dgvLogs, e);87 }88//关闭窗⼝89private void btnClose_Click(object sender, EventArgs e)90 {91this.Close();92 }9394#region分页显⽰9596//跳转到97private void btnGoTo_Click(object sender, EventArgs e)98 {99if (objLog == null)//未查询100 {101return;102 }103int current = Convert.ToInt32(this.txtGoTo.Text.Trim());104if (current < 1 || current > objLog.PageCount)105 {106 MessageBox.Show("⽆该页数据!", "查询提⽰");107return;108 }109this.lblCurrentPage.Text = current.ToString();110 objLog.CurrentPage = current - 1;111this.dgvLogs.DataSource = objDS.Tables[objLog.CurrentPage];112//所有按钮开启113this.btnFirst.Enabled = true;114this.btnNext.Enabled = true;115this.btnPrevious.Enabled = true;116this.btnLast.Enabled = true;117//当到达第⼀页118if (objLog.CurrentPage == 0)119 {120this.btnPrevious.Enabled = false;121this.btnFirst.Enabled = false;122 }123//当到达最后⼀页124if (objLog.CurrentPage == objLog.PageCount - 1)//当前页从0开始,页总数从1开始125 {126this.btnNext.Enabled = false;127this.btnLast.Enabled = false;128 }129 }130//第⼀页131private void btnFirst_Click(object sender, EventArgs e)132 {133if (objLog == null)//未查询134 {135return;136 }137this.dgvLogs.DataSource = null;138 objLog.CurrentPage = 0;139this.dgvLogs.DataSource = objDS.Tables[objLog.CurrentPage];140//计算当前页141this.lblCurrentPage.Text = (objLog.CurrentPage + 1).ToString();142//开启按钮143this.btnLast.Enabled = true;144this.btnNext.Enabled = true;145//关闭按钮146this.btnPrevious.Enabled = false;147this.btnFirst.Enabled = false;148 }149//下⼀页150private void btnNext_Click(object sender, EventArgs e)151 {152if (objLog == null)//未查询153 {154return;155 }156this.dgvLogs.DataSource = null;157 objLog.CurrentPage++;158this.dgvLogs.DataSource = objDS.Tables[objLog.CurrentPage];159this.btnFirst.Enabled = true;160this.btnPrevious.Enabled = true;161//计算当前页162this.lblCurrentPage.Text = (objLog.CurrentPage + 1).ToString();163//当到达最后⼀页164if (objLog.CurrentPage == objLog.PageCount - 1)//当前页从0开始,页总数从1开始165 {166this.btnNext.Enabled = false;167this.btnLast.Enabled = false;168 }169 }170//上⼀页171private void btnPrevious_Click(object sender, EventArgs e)172 {173if (objLog == null)//未查询174 {175return;176 }177this.dgvLogs.DataSource = null;178 objLog.CurrentPage--;179this.dgvLogs.DataSource = objDS.Tables[objLog.CurrentPage];180this.btnNext.Enabled = true;181this.btnLast.Enabled = true;182//计算当前页183this.lblCurrentPage.Text = (objLog.CurrentPage + 1).ToString();184//当到达第⼀页185if (objLog.CurrentPage == 0)186 {187this.btnPrevious.Enabled = false;188this.btnFirst.Enabled = false;189 }190 }191//最后页192private void btnLast_Click(object sender, EventArgs e)193 {194if (objLog == null)//未查询195 {196return;197 }198this.dgvLogs.DataSource = null;199//当前页从0开始,页总数从1开始200 objLog.CurrentPage = objLog.PageCount - 1;201this.dgvLogs.DataSource = objDS.Tables[objLog.CurrentPage];202//计算当前页203this.lblCurrentPage.Text = (objLog.CurrentPage + 1).ToString();204//开启按钮205this.btnPrevious.Enabled = true;206this.btnFirst.Enabled = true;207//关闭按钮208this.btnNext.Enabled = false;209this.btnLast.Enabled = false;210 }211212#endregion213 }214 }View Code结果展⽰该项⽬还未全部完成,完成后我会上传整个项⽬的GitHub地址……还请各位指教!注:以上代码为显⽰出记录总数,⾃⾏查看。
ADO_NET中实现查询结果的分页显示
ADONET中实现查询结果的分页显示
中实现查询结果的分页显示一、问题分析:我们利用进行数据库编程时,一般是将查询结果填充到DataSet的DataTable对象中,再通过与其绑定的DataGrid控件显示出来。
很多时候查询结果的记录数会比较大,虽然理论上一个DataTable 对象可以容纳16000000行,但在实际操作中,我们实在没有必要将全部记录装入DataTable,原因在于:用户肯定不会同时浏览这么多行,滚动条的出现使程序操作更繁琐,并且通过网络传输的记录太多,程序的效率也会大大降低。
因此应尽量减少读取的记录数,采用分页机制:一次显示一页内容,只读取需要的记录。
在填充DataTable时,将起始记录和记录个数作为参数传递给DataAdapter的Fill方法,就能实现简单的分页效果,代码如下:da.Fill(dt,(n-1)*10,10,"订单") '读订单表的第n页(每页10行)填充dt实际在执行时,DataAdapter仍然要读取指定记录前的所有记录(即包括前n-1页),然后放弃它们。
所以该方法只适用于较小的数据表,若处理大型数据库,并不能实质上提升效率。
为了更好的实现分页机制,必须编写一些灵活的SQL语句。
二、实现方法:(订单表)如图所示,假设有一个12条记录的数据表“订单”,按“订单ID”列排序,我们要分3页显示,每页4行,获取第1页的SQL语句很简单:SELECT TOP 4 * FROM 订单 ORDER BY 订单ID移到下一页的语句也很简单,假设当前正处于表的第2页,想读出后4行,这些行的订单ID值应大于当前页最后一条记录的订单ID值:SELECT TOP 4 * FROM 订单 WHERE 订单ID>8 ORDER BY 订单ID获取最后一页的语句稍复杂一些:按反向顺序读取记录,然后选择结果中的前4行。
为简化问题,我们假设表中的总记录数是每页记录数的整数倍:SELECT TOP 4 * FROM 订单 ORDER BY 订单ID DESC但这样得到的结果,行的顺序是反的(即按订单ID从大到小排列),所以需要颠倒这些行的顺序,我们将以上查询当作另一个正向排序查询命令的子查询:SELECT * FROM 订单 WHERE 订单ID IN(SELECT TOP 4 订单ID FROM 订单 ORDER BY 订单ID DESC)ORDER BY 订单ID假设当前页是第2页,移到上一页的语句如下,同样要将行的顺序颠倒一次:SELECT * FROM 订单 WHERE 订单ID IN(SELECT TOP 4 订单ID FROM 订单 WHERE 订单ID<5 ORDER BY 订单ID DESC)ORDER BY 订单ID现在可以在Windows窗体或Web窗体中实现第一页、上一页、下一页、最后一页等按钮了,我们再添加一个“转到”按钮,实现直接显示第n页的效果。
使用GridView和ObjectDataSource实现真分页
1.1 使用GridView和ObjectDataSource实现真分页GridView和ObjectDataSource的联合使用可以实现真分页,步骤取下:1、编写业务逻辑类,该类中至少需要2个方法:一个查询数据的方法,另一个是返回表中记录总数的方法,详解如下:public static class ObjectDataSourcePage{private static string ConnString =ConfigurationManager.ConnectionStrings["gvdb"].ConnectionString;///<summary>///定义一个方法用来获取指定范围的记录///</summary>///<param name="startIndex">记录的起始编号</param>///<param name="maxRows">每次返回的记录总数,也就是每页的记录数</param>///<returns></returns>public static DataView GetPagedStuInfo(int startIndex, int maxRows) {SqlDataSource ds = new SqlDataSource();ds.ConnectionString = ConnString;ds.SelectCommandType =SqlDataSourceCommandType.StoredProcedure; ds.SelectCommand = "P_GetPagedStuInfo";ds.SelectParameters.Add("StartIndex",(startIndex + 1).ToString());ds.SelectParameters.Add("EndIndex",(startIndex + maxRows ).ToString());DataView dv =(DataView)ds.Select(DataSourceSelectArguments.Empty);return dv;}///<summary>///返回记录总数///</summary>///<param name="startIndex">没用</param>///<param name="maxRows">没用</param>///<returns></returns>public static int GetStuInfoCount(int startIndex, int maxRows){SqlDataSource ds = new SqlDataSource();ds.ConnectionString = ConnString;ds.SelectCommandType =SqlDataSourceCommandType.StoredProcedure;ds.SelectCommand = "P_GetStuInfoCount";DataView dv =(DataView)ds.Select(DataSourceSelectArguments.Empty);return (int)dv[0][0];}}注意:GetPagedStuInfo(int startIndex, int maxRows)方法用来从数据库提取数据,该方法必须且只能具有2个参数。
ADO.NET中实现查询结果的分页显示
中实现查询结果的分页显示
胡勇智
【期刊名称】《智能计算机与应用》
【年(卷),期】2005(000)006
【摘要】以为工具,介绍了在中,利用SQL语句实现查询结果分页显示的方法.
【总页数】2页(P27-28)
【作者】胡勇智
【作者单位】成都理工大学德阳分校信息工程系,618000
【正文语种】中文
【中图分类】TP3
【相关文献】
1.ASP查询Web数据库记录的分页显示技术与实现 [J], 赵玲;关立行
2.使用XML数据岛实现数据库查询的分页显示 [J], 张树亮
3.对WEB数据查询分页显示的设计与实现 [J], 洪新建;张阳;洪新华
4.ASP中分页显示查询记录的实现方法及比较 [J], 李锐
5.PHP中分页显示查询记录的实现方法 [J], 罗云芳;
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
有了以 上 三 个 属 性 的 支 持 , 我 们 可 以 设 置 两 个 Reco rdset 对象 ,利用第一个 Reco rdset 对象查询 数据库并得 到记 录集 , 设置 该 Recordset 对象的 PageSize 和 PageCo unt 属 性 , 利 用 A bsolute Page 属性定位到特定某一页 ,将这一页的数据再添加到 第二个 Recordset 对象中 ,这样第二个 Recordset 对象就得到数据库结果集的一个子集 。将第二个 Reco rdset 对象绑定到 Data Grid 控件上 ,从而实现 分页显示的效果 。根据上述分析给出 VB 的实现 代码 。
2 Data Grid 控件与 ADO 简介
Data Grid 是 VB 中用于数据显示的常用控件 , 它的主要用途在于从数据库如 SQL Server ,Access 以及 XML 文件中获取数据[5] ,并将这些数据用表 格的形式显示出来 ,同时 ,还提供给用户很方便的 界面对这些数据进行操作 。Data Grid 控件要显示 数据 ,需要设置几个常用的属性 ,如表 1 所示[6] 。
p ages displayi ng met hod base d on D at a Grid comp one nt a nd recor dset w hic h is one object of A D O . The n t he met hod is i m2 p le me nt ed wit h VB code a nd is app lie d i nt o t he develop me nt p r ocess of p r oject .
End Sub / / 分页显示函数 Private Sub LoadCo nt rol ( IPage As Long) Dim RS1 As ADODB. Reco rdset/ / 定 义 第 一 个 Reco rdset 对象 Dim IPageCount As Lo ng/ / 定义要显示的总页数 Dim nPageSize As Integer Dim ICount As Long nPageSize = 10/ / 每页显示 10 条记录
3. 2 分页显示的实现 ADO 当中的 RecordSet 对象用来保存由 SQL
查询语句返回的记录集 ,如果直接将 Reco rdset 对 象绑定到 Data Grid 的 DataSo urce 属性 ,那么 Dat2 a Grid 会将所有的记录集全部显示[9] 。当记录集中 的数据量很大时 ,显然不方便用户的浏览 。由于 Recordset 对象的 PageSize 属性可以保存当前一 页所要显示数据的个数 , PageCo unt 属性表示数据 显示的总页数 ,它的值可以根据 SQL 查询返回的 记录集个数除以 PageSize 属性的值向后取整得 到 。A bsolute Page 属性表示当前显示的页面数 。
页数 ICurrent Page = IPage If ICurrent Page > IPageCo unt Then ICurrent Page = IPageCo unt End If RS1. AbsolutePage = ICurrent Page/ / 定位到当前
要显示的页数 Dim RS2 As New ADODB. Reco rdset/ / 定义第二
个 Reco rdset 对象 / / 将第一个 Recordset 对象中保存的各个字段名称
添加到第二个 Recordset 对象中 For ICount = 0 To RS1. Fields. Co unt 21 RS2. Fields. Append RS1. Fields (lCount) . Name ,
(OL EDB ) ”, 完 成 该 控 件 的 添 加 , 如 图 1 所 示 。 ADO 也不是 VB 默认的数据类型 ,需要手动添加 。 打开“工程”菜单的“引用”项 ,选择“Micro soft Ac2 tiveX Data Object 2. 1 Library”,完成 ADO 对象的 添加 ,如图 2 所示 。
第 37 卷 (2009) 第 7 期
计算机与数字工程
199
Set RS1 = New ADODB. Recordset/ / 创建第一个 Recordset 对象 ,并返回查询结果集
RS1. Open “select 3 f rom teacher Info ”, co nn ,
adOpenStatic , adLockOptimistic RS1. PageSize = nPageSize/ / 设置 PageSize 属性 IPageCo unt = RS1. PageCount/ / 得到要显示的总
Ke y w ords VB , D at a Grid , A D O , muti2p ages displayi ng Clas s N u m ber TP393
1 引言
VB (Visual Basic) 是 Window s 环境下简单 、易 学 、高效的可视化编程语言开发系统[1] ,它提供了 功能强大 、丰富多样的控件对图形界面的搭建提供 支持 ,采用事件驱动模型对控件进行编程[2] ,具有 数据库访问简单等特点 ,因此成为中小企业数据库 应用系统开发的首选工具 。Data Grid 就是一款方 便显示数据的控件 ,将它的 DataSo urce 属性与包 含数据库记录集的对象绑定就能很容易的显示记 录集的数据[3] 。ActiveX Data Object s ( ADO) 是微 软最新的数据访问技术[4] 。它被设计用来同新的 数据访问层 OL EDB Provider 一起协同工作 ,以提 供通用数据访问 ( U niversal Data Access) 。本文提 出了一种将 Data Grid 控件与 ADO 相结合实现数 据分业显示的方法 ,该方法对以 VB 开发数据库系 统在数据分页显示问题上具有借鉴意义 。
adVarChar , RS1. Fields (lCo unt) . DefinedSize Next RS2. Open / / 将第一个 Recordset 对象某一页中的记录集添加到
第二个 Recordset 对象中
For ICount = 1 To nPageSize RS2. AddNew RS2. Fields (0) . Value = RS1. Fields (0) . Value/ / 将 RS1 中的每一个字段赋值给 RS2 的每一个字段 …………………………………………. . RS1. MoveNext/ / 移到下一条记录上
第 37 卷
表 2 ADO 常用对象及其作用
对象
主要作用
Connection 完成对数据库的连接 ,以及基本的设置 和事务的处理
Co mma nd
负责执行 SQL 命令 ,定义查询参数或 执行一个有输出参数的存储过程
Reco rdset Parameter
存放从数据库返回的结果集
在特定的上下文环境中 ,与 Command 对象相联系进行参数化查询
关键词 VB Data Grid 控件 ADO 分页显示 中图分类号 TP393
I mple me nti on of D at a Muti2p a ges Displa yi ng B ase d
on Data Grid Comp onent and ADO
O uya ng Hongji Ge Me ng
End Sub / / 添加一个 Button 按钮 ,用来执行翻页 (上一页) 操作 Private Sub cmdPrevious_Click () If ICurrent Page > 1 Then ICurrent Page = ICurrent Page 2 1 Call LoadCont rol ( ICurrent Page) / / 调用分页显示 函数 End If
表 1 Data Grid 控件的常用属性
属性
作用
AllowAddNew 是否允许添加交互纪录 。取值为 True 或 False
AllowArrows 是否允许使用网络导航的箭头键 。 取值为 True 或 False
AllowDelete 允许删除交互纪录 。取值为 True 或 False
DataMember 获得或设置一个值 ,为数据连接描 述数据对象
功能[ 7~8 ] 。
3 数据分页显示的实现
3. 1 添加 Data Grid 控件与 ADO 对象 Data Grid 控件不在 VB 默认的工具箱中 ,需要
手动进行添加 。打开“工程”菜单的“部件”项 ,在 “控件”栏中选择“Micro soft Data Grid Co nt rol 6. 0
DataSource 设置或获取控件的数据源
3 收稿日期 :2009 年 3 月 13 日 ,修回日期 :2009 年 4 月 10 日 作者简介 :欧阳宏基 ,男 ,硕士 ,助教 ,研究方向 : Web 应用 、网络安全与系统集成 。
198
欧阳宏基等 :基于 Data Grid 控件与 ADO 实现数据的分页显示
( I nf or mation Engi nee ri ng College , Xia nya ng N or mal U niversit y , Xia nya ng 712000)
Abs t rac t A nalyses t he D at a Grid’s com mon at t ribut es a nd com mon objects of A D O . The p ap er bri ngs a dat a 问数据库主要有两种
方式 ,一种是使用 ADO Data 控件 ,通过对控件的
绑定来访问数据库 ; 另一种是使用 ADO 对象模