刚开始学习.NET编程的时候,有一个感受,就是学过的基础知识,刚开始的时候理解了,也会了,但以后老是不用的话,慢慢就会遗忘。所以个人觉得初学者应该学会用学过的知识尝试着做一些小项目,加深对知识的理解和印象,学以致用。
以前学习数据绑定控件时,把数据表绑定到数据控件,利用数据控件的分页功能对数据进行分页,很方便。但是对于一个数据行数很多的表来说,由于数据控件每次翻页,都要重新查询一次表的所有数据,造成速度和效率低下。现在学了sql语句的知识,就尝试着用sql语句来对数据进行高效率分页。
高效率分页的思路就是对数据表的数据进行排序,根据每页显示几条数据和当前页的页码,只查询这个页码的那几条数据返回给数据控件进行显示,不用每次都要查询数据表的所有数据行。
一步一步来,首先我们有一个数据库如下图:
然后我们创建windows窗体应用程序,窗口放置一个DataGridView控件和四个按钮,如图:
将数据库连接对象创建为全局变量,以便在各个方法中都可以控制数据库的连接和关闭。另外我们还需要当前页码数,每页的记录数、总页数来控制页码翻页,要知道总页数需要查询总记录数,这几个变量都创建为全局变量,代码如下:
static string str = "data source=localhost;integratedsecurity=SSPI;database=firstdb";
SqlConnection conn = newSqlConnection(str);
static int page = 1;//当前页码
static int pagecount = 2;//每页的记录数,我们设置每页的记录数为两条
static int count = 0;//数据表中总记录数
static int allpage =0;//总页数
(vs复制代码粘到word里竟然有乱码。。。)
1、初始化窗体
在窗体的构造函数中,首先我们要查询数据库显示第一页的数据(方法为ShowFirstPage();),并查询出总记录数(方法为Count();),计算总页数,具体代码为:
private void ShowFirstPage()//显示第一页数据
{
conn.Open();
SqlCommandcomm = new SqlCommand("select top " + pagecount + " id as '序号',name as '姓名',gender as '性别' from table1", conn);
SqlDataAdapter adapt = new SqlDataAdapter(comm);
DataSet ds = new DataSet();
adapt.Fill(ds);
dgv1.DataSource = ds.Tables[0].DefaultView;
conn.Close();
}
private voidCount()//计算总记录数和总页数
{
conn.Open();
SqlCommand comm1 = new SqlCommand("selectcount(*) from table1", conn);
count = (int)comm1.ExecuteScalar();//查询并计算数据表中的总记录数
allpage = (int)Math.Ceiling(count * 1.0 /pagecount);//计算总页数
conn.Close();
}
2、第一页按钮实现
private void btnfirst_Click(object sender,EventArgs e)
{
page = 1;//将页码数变为1
btnprevious.Enabled = false;//使前一页按钮不可用
btnnext.Enabled = true;//使下一页按钮可用
//显示第一页数据
ShowFirstPage();
}
3、上一页按钮实现
private void btnprevious_Click(objectsender, EventArgs e)
{
btnnext.Enabled = true;//使下一页按钮可用
//如果当前页为第二页,那么显示第一页数据,并使前一页按钮不可用
if (page == 2)
{ ShowFirstPage();
page--;
btnprevious.Enabled = false;
}
else//当前页不是第二页,显示上一页数据
{ ShowPrevious();
}
}
private void ShowPrevious()//显示上一页数据
{
conn.Open();
SqlCommand comm = new SqlCommand("select top " + pagecount
+ "+ id as '序号',name as '姓名',gender as '性别' from table1 where
id>(select max(id) from (select top" + pagecount * (page - 2) + " id
from table1 order by id) o)", conn);
SqlDataAdapter adapt = new SqlDataAdapter(comm);
DataSet ds = new DataSet();
adapt.Fill(ds);
dgv1.DataSource = ds.Tables[0].DefaultView;
conn.Close();
page--;//当前页前移一页
}
4、下一页按钮实现
private void btnnext_Click(object sender, EventArgse)
{
btnprevious.Enabled = true;//使上一页按钮可用
if (page == allpage - 1)//如果当前页为倒数第二页,使下一页
按钮不可用,显示最后一页数据
{
btnnext.Enabled = false;
ShowNext();
}
else//如果当前页不是倒数第二页,下一页按钮可用,显示下一页
数据
{
ShowNext();
}
}
private void ShowNext()//显示下一页数据
{
conn.Open();
SqlCommand comm = new SqlCommand("select top " + pagecount
+ " id as '序号',name as '姓名',gender as '性别' from table1 where
id>(select max(id) from (select top" + pagecount * page + " id from
table1 order by id) o)", conn);
SqlDataAdapter adapt = new SqlDataAdapter(comm);
DataSet ds = new DataSet();
adapt.Fill(ds);
dgv1.DataSource = ds.Tables[0].DefaultView;
conn.Close();
page++;//当前页后移一页
}
5、最末页按钮实现、
private void btnlast_Click(object sender,EventArgs e)
{
btnnext.Enabled = false;//使下一页按钮不可用
btnprevious.Enabled = true;//使上一页按钮可用
ShowLast();//显示最后一页数据
}
private void ShowLast()
{
conn.Open();
SqlCommand comm = new SqlCommand("select id as '序号',name
as '姓名',gender as '性别' from table1 where id>(select max(id) from
(select top " + pagecount *(allpage-1) + " id from table1 order by
id) o)", conn);
SqlDataAdapter adapt = new SqlDataAdapter(comm);
DataSet ds = new DataSet();
adapt.Fill(ds);
dgv1.DataSource = ds.Tables[0].DefaultView;
conn.Close();
page = allpage;//当前页设置为末页
}
效果图: