WinForms中DataGridView控件做一个类似于网站那样的分页功能

WinForms中DataGridView控件做一个类似于网站那样的分页功

在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();
        }
     } 
} 


 

猜你喜欢

转载自blog.csdn.net/gongyuan303/article/details/6793038