C# winform程序实现分页的三种方法

来源:互联网 发布:手机淘宝装修尺寸 编辑:程序博客网 时间:2024/04/30 06:54

有几种方法

 

第一种: 如果你的表中有主键ID, 可以直接按ID号取每页的数据。直接用SQL语句就行,这里不例举了。

 

第二种: 使用存储过程分页取数据,再填充到dataGridView中。

                    ①当你的表中没有主键ID的时候

  1. CREATE PROCEDURE dbo.PageCut 
  2.     (
  3.         @pageSize int ,--每页显示的条数
  4.         @pageIndex int  --当前页
  5.     )
  6. AS
  7.     SET NOCOUNT ON  
  8.     declare @sqlstr varchar(1000)
  9.     set @sqlstr = 'select top '+ str(@pageSize) +'  *  from(select top 'str(@pageIndex*@pageSize) +
  10.      '* from mainTable order by software) as a order by software desc '
  11.     --原sql语句 select top 5 * from(select top 10 * from mainTable order by software )as a order by software desc 
  12.     --如果是第二页每页5条,那么返回的就是 取前面5*2 = 10条数据(第二句select),把这10条数据desc逆序反过来,再在这10条数据里面取前面pagesize=5条,也就是后面倒数5条
  13.     exec(@sqlstr);
  14.     RETURN

                str()将int型转为string型,winform中只需要调用这个带参数的存储过程就行了。如下:

  1.  //
  2.         //取出第X页填充datagridview
  3.         public void cutPages()
  4.         {
  5.             //调用PageCut存储过程
  6.             SqlCommand comm = new SqlCommand("PageCut", conn);
  7.             comm.CommandType = CommandType.StoredProcedure;
  8.             SqlParameter para1 = new SqlParameter("@pageSize", SqlDbType.Int);
  9.             SqlParameter para2 = new SqlParameter("@pageIndex", SqlDbType.Int);
  10.             para1.Value = PAGESIZE;
  11.             para2.Value = PAGEINDEX;
  12.             comm.Parameters.Add(para1);
  13.             comm.Parameters.Add(para2);
  14.             DataSet ds = new DataSet();
  15.             SqlDataAdapter da = new SqlDataAdapter(comm);
  16.             da.Fill(ds, "mainTable");
  17.             dataGridView1.DataSource = ds.Tables["mainTable"].DefaultView;
  18.             comm.Dispose();
  19.             da.Dispose();
  20.             ds.Dispose();
  21.         }

不过我发现这种取倒数第pageSize条的方法的最后1页会将表中最后的pageSize条数据都取出来,例如:pageSize=5,最后一页只有2条的时候,会取出5条数据。

 

                    ②当你的表中有主键ID的时候

存储过程中的组合sql这样写:

  1. SELECT TOP 100 *
  2. FROM testPROC
  3. WHERE (testid NOT IN  (SELECT TOP 19910 testid FROM testPROC ORDER BY testid))ORDER BY testid

它的意思是: 子句的select的意思是查询表的前19910个数据,主句where的意思是说 testId不在(NOT IN)子句查询出来的19910个结果当中的前100个。整个语句其实取的是表的第19910个数据开始往下到第20000个,这中间的100个数据。

 

或者是这样写:

 

 

 

  1. SELECT 
  2. TOP 10 *  FROM TestTable
  3. WHERE 
  4. (ID >(SELECT MAX(id) FROM (SELECT TOP 20 id FROM TestTable ORDER BY id) AS T))
  5. ORDER BY ID

它的意思是:从testTable中取出top20条,然后得到这20条中最大的ID号“20”,然后主句就从ID>20开始取10个,这样就取到了21-30这10个数据。

 

 

第三种: 使用dataAdapter.Fill()方法。

如果你的表中没有设置主键,那只能按照数据库中的第m条数据-->第n条数据这中方式来取。

                  dataAdapter.Fill()方法有13个重载方法,其中有个Fill(DataSet, Int32, Int32, String)方法,参数为(dataSet,开始条数,   取多少条,dataSet中的表名)。

                 代码如下:

  1.  private const int pageSize = 5; //每页的条数
  2.         private int startIndex = 0;//默认开始条为第0条
  3.         public Form1()
  4.         {
  5.             InitializeComponent();
  6.         }
  7.         private void Form1_Load(object sender, EventArgs e)
  8.         {
  9.             openConn(pageindex);
  10.         }
  11.         /// <summary>
  12.         /// 
  13.         /// 打开连接,绑定数据源
  14.         /// </summary>
  15.         /// <param name="si">startIndex,开始的条目序号</param>
  16.         private void openConn(int si) {
  17.             string conStr = "Data Source=COMPANY-B03B094;Initial Catalog=AccountManager;Persist Security Info=True;User ID=sa;Password=sa;Pooling=False";
  18.             SqlConnection con = new SqlConnection(conStr);
  19.             SqlDataAdapter da = new SqlDataAdapter("select * from mainTable", con);
  20.             DataSet ds = new DataSet();
  21.             da.Fill(ds, si, pageSize, "mainTable");
  22.             dataGridView1.DataSource = ds.Tables[0].DefaultView;
  23.             con.Open();
  24.             con.Close();
  25.             da.Dispose();
  26.             ds.Dispose();
  27.         }
  28.         private void button1_Click(object sender, EventArgs e)//下一页
  29.         {
  30.             openConn(startIndex += pageSize);//每点击一次下一页就将开始的序号加pageSize
  31.         }
  32.         private void button2_Click(object sender, EventArgs e)//上一页
  33.         {
  34.             openConn(startIndex -= pageSize);
  35.         }
原创粉丝点击