在WinForms中使用DataGridView控件分页有两种情况:一、真分页.二、假分页。好,既然分了两种情况,那么我们就来谈一下什么是真分页,什么是假分页?先谈假分页吧!我们都知道,在C#中使用ADO.NET访问数据库中的数据,以Sql Server为例,需要使用一个叫SqlDataAdapter的对象的Fill()方法来填充数据集,DataSet是一个虚拟表,在WinForms中操作数据其实就是操作SqlDataAdapter对象填充的DataSet,假分页就是把数据库的数据通过SqlDataAdapter对象填充到数据集里。然后在WinForms中或者在ASP.NET只显示DataSet里一条或者几条数据,这样也可以实现一个分页。但是这样做根本没有实际的意义,为什么呢?很简单,因为程序还是把数据库里的数据全部加载到DataSet里,只不过我们控制它的显示而已!这样,性能一点没有得到提升。大家可以实际的操作一下。这里我就不去演示了,今天我所讲的是真分页。真分页就是我要多少条数据,SqlDataAdapter对象就去数据库取多少条数据,那么这样的话在性能上就得到了一个很大的提升。因为我填充DataSet时只需要填充提取出来的数据! 好了,说了这么多理论概念,下面我就把实现好的代码添出来,大家可以参考一下: 1、在使用真分页时需要使用T-SQL创建一个分页的存储过程,具体代码如下:
CREATE PROCEDURE proc_Page
@Table VARCHAR(1000), --表名
@Primarykey VARCHAR(100), --主键
@Condition VARCHAR(5000), --查询条件
@PageNumber INT, --开始页数
@PageSize INT, --每页大小
@IsCount BIT --是否获得记录数,0为否
AS
DECLARE @SQL VARCHAR(8000)
IF @IsCount != 0
SET @SQL = 'SELECT Count(*) FROM ' + @Table + ' WHERE ' + @Condition
ELSE
BEGIN
IF @PageNumber = 1
SET @SQL = 'SELECT TOP ' + STR(@PageSize) + ' * FROM ' + @Table + ' WHERE ' + @Condition
ELSE
SET @SQL = 'SELECT TOP ' + STR(@PageSize) + ' * FROM ' + @Table +
' WHERE ' + @Primarykey + ' NOT IN (SELECT TOP ' + STR(@PageSize*(@PageNumber - 1))
+ ' ' + @Primarykey + ' FROM ' + @Table + ' WHERE ' + @Condition + ') AND ' + @Condition
END
EXEC(@SQL)
2、写完存储过程之后,下面就是建一个Windows窗体应用程序。首先在窗体里拖放一个DataGridView控件,将name属性修改为dgbPage,在拖放四个Button,第一个Text值为"首页",name属性为"btnFirst",第二个Text值为"上一页",name属性为"btnFirstPage",第三个Text值为"下一页",name属性为"btnNext",第四个Text值为"尾页",name属性为"btnLast".在拖放一个Label控件,Text属性暂时不需要设置,待会通过程序动态实现,name属性为"lblPageInfo",具体实现代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
/// Add BY ZXM
namespace MarkingPage
{
public partial class frmMarkingPage : Form
{
int pageCount = 1; //当前页数
int pageSum = 0; //总页数
int resultCount = 10; //每页记录数
int resultSum = 0; //总记录条数
string where = "1 = 1"; //查询条件
public frmMarkingPage()
{
InitializeComponent();
}
private void frmMarkingPage_Load(object sender, EventArgs e)
{
pageCount = 1;
Page();
}
private void Page()
{
this.dgbPage.DataSource = this.GetStudentInfo(where, pageCount, resultCount, 0);
resultSum = Convert.ToInt32(this.GetStudentInfo(where, 0, 0, 1).Rows[0][0]);
if (resultSum % resultCount == 0)
pageSum = resultSum / resultCount;
else
pageSum = resultSum / resultCount + 1;
this.lblPageInfo.Text = "第 " + pageCount + " 页 | 共 " + pageSum + " 页 | 每页 " + resultCount + " 条 | 共 " + resultSum + " 条";
}
public DataTable GetStudentInfo(string Condition, int pageNumber, int PageSize, int isCount)
{
SqlParameter[] sqlParameter =
{
new SqlParameter("@Table","student"),
new SqlParameter("@Primarykey","stuID"),
new SqlParameter("@Condition",Condition),
new SqlParameter("@PageNumber",pageNumber),
new SqlParameter("@PageSize",PageSize),
new SqlParameter("@IsCount",isCount)
};
using (SqlConnection sqlConnection = new SqlConnection("Data Source=.;Initial Catalog=TestData;Integrated Security=True"))
{
try
{
sqlConnection.Open();
SqlCommand sqlcommand = new SqlCommand("proc_Page", sqlConnection);
sqlcommand.CommandType = CommandType.StoredProcedure;
sqlcommand.Parameters.AddRange(sqlParameter);
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
sqlDataAdapter.SelectCommand = sqlcommand;
DataTable dt = new DataTable();
sqlDataAdapter.Fill(dt);
return dt;
}
catch (SqlException ex)
{
throw ex;
}
catch (Exception ex)
{
throw ex;
}
}
}
//分页-单击上一页
private void linkFirstPage_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
if (pageCount == 1)
MessageBox.Show("已经到达首页!");
else
{
pageCount--;
this.Bind1();
}
}
//分页-单击下一页
private void linkNextPage_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
if (pageCount >= pageSum)///查询数据为空的时候做验证
MessageBox.Show("已经到达尾页!");
else
{
pageCount++;
this.Bind1();
}
}
//分页-单击首页
private void linkFrist_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
pageCount = 1;
this.Bind1();
}
//分页-单击尾页
private void linkLastPage_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
if (pageSum < 1)///查询数据为空的时候做验证
{
pageSum = 1;
}
pageCount = pageSum;
this.Bind1();
}
}
} |