分享一個Winform下的分頁控制元件
阿新 • • 發佈:2018-11-13
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
前兩天有一個簡單的C/S專案用到分頁,因為是Winform下,沒有現成的,自己也懶得寫,就找了下,看到了ycmoon的一個控制元件
http://www.cnblogs.com/ycmoon/archive/2010/01/07/1640689.html
參考後,做了簡化,只保留了分頁的部分,主要是點選事件的Delegate,未做過多測試,有興趣的朋友可以下載原始碼自行修改,如有好的建議,也可以給我反饋。[email protected],效果如下:
控制元件設計介面:
設計時:
執行時:
附帶一個取分頁資料的儲存過程:
[ruby] view plain copy print ?- Create DataBase Db_TonyPaging
- go
- use Db_TonyPaging
- go
- if exists (select 1
- from sysobjects
- where id = object_id('DepartDemo'
- and type = 'U')
- drop table DepartDemo
- go
- /*==============================================================*/
- /* Table: DepartDemo */
- /*==============================================================*/
- create table DepartDemo (
- PKID int identity(1,1),
- DName nvarchar(200) null,
- DCode nvarchar(500) null,
- Manager nvarchar(50) null,
- ParentID int null default 0,
- AddUser nvarchar(50) null,
- AddTime datetime null,
- ModUser nvarchar(50) null,
- ModTime datetime null,
- CurState smallint not null default 0,
- Remark nvarchar(500) null,
- F1 int not null default 0,
- F2 nvarchar(300) null,
- constraint PK_DEPARTDEMO primary key (PKID)
- )
- go
- truncate table DepartDemo
- go
- /***************建立54 條測試資料*********************
- ****************downmoo 3w@live.cn ***************/
- declare @d datetime
- set @d=getdate()
- declare @i int
- set @i=1
- while @i<=54
- begin
- --插入一條測試資料
- insert into DepartDemo
- select '國家統計局房產審計'+Cast(@i as Nvarchar(10))+'科','0','胡不歸',0,'DemoUser',getdate(),
- '','1900-01-01',1,'專業評估全國房價,為老百姓謀福祉',0,''
- set @i=@i+1
- end
- go
- --***********分頁儲存過程用於SQL server2005/2008、2008R2****************************
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- Create PROCEDURE [dbo].[ZJF_CPP_GetPagedRecordFor2005_2008]
- (@Table varchar(1000), --表名,多表是請使用 tA a inner join tB b On a.AID = b.AID
- @TIndex nvarchar(100), --主鍵,可以帶表頭 a.AID
- @Column nvarchar(2000) = '*',--讀取欄位
- @Sql nvarchar(3000) = '',--Where條件
- @PageIndex int = 1, --開始頁碼
- @PageSize int = 10, --頁大小
- @Sort nvarchar(200) = '' --排序欄位
- )
- AS
- DECLARE @strWhere varchar(2000)
- declare @strsql nvarchar(3900)
- IF @Sql IS NOT NULL AND len(ltrim(rtrim(@Sql)))>0
- BEGIN
- SET @strWhere = ' WHERE ' + @Sql + ' '
- END
- ELSE
- BEGIN
- SET @strWhere = ''
- END
- if (charindex(ltrim(rtrim(@TIndex)),@Sort)=0)
- begin
- if(@Sort='')
- set @Sort = @TIndex + ' DESC '
- else
- set @Sort = @Sort+ ' , '+@TIndex + ' DESC '
- end
- IF @PageIndex < 1
- SET @PageIndex = 1
- if @PageIndex = 1 --第一頁提高效能
- begin
- set @strsql = 'select top ' + str(@PageSize) +' '+@Column+ ' from ' + @Table + ' ' + @strWhere + ' ORDER BY '+ @Sort
- end
- else
- begin
- /**//**//**//*Execute dynamic query*/
- DECLARE @START_ID nvarchar(50)
- DECLARE @END_ID nvarchar(50)
- SET @START_ID = convert(nvarchar(50),(@PageIndex - 1) * @PageSize + 1)
- SET @END_ID = convert(nvarchar(50),@PageIndex * @PageSize)
- set @strsql = ' SELECT '+@Column+ '
- FROM (SELECT ROW_NUMBER() OVER(ORDER BY '[email protected]+') AS rownum,
- '[email protected]+ '
- FROM '[email protected] +' WITH(NOLOCK) ' + @strWhere +') AS D
- WHERE rownum BETWEEN '[email protected]_ID+' AND ' [email protected]_ID +' ORDER BY '+@Sort
- END
- EXEC(@strsql)
- print @strsql
- set @strsql = 'SELECT Count(1) as TotalRecords FROM ' + @Table +' WITH(NOLOCK) ' + @strWhere
- print @strsql
- EXEC(@strsql)
在WinForm專案中,需要設定控制元件的總記錄數RecordCount(由分頁儲存過程計算得出),和翻頁事件winFormPager1_PageIndexChanged。
測試原始碼如下:
[c-sharp] view plain copy print ?
- 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;
- namespace DemoPager
- {
- public partial class frmMain : Form
- {
- public frmMain()
- {
- InitializeComponent();
- }
- #region Members
- //總記錄數
- public int RecordCount = 0;
- private string strConn = @"Data Source=ap2/vegnet;Initial Catalog=Db_TonyPaging;Integrated Security=SSPI;";
- //"Server=localhost;database=Db_TonyPaging;uid=sa;pwd=sa;";
- private string strProcedure = "ZJF_CPP_GetPagedRecordFor2005_2008";
- #endregion
- #region Methods
- /// <summary>
- /// 繫結第Index頁的資料
- /// </summary>
- /// <param name="Index"></param>
- private void BindDataWithPage(int Index)
- {
- winFormPager1.PageIndex = Index;
- //winFormPager1.PageSize = 10;; ;
- dgvList.DataSource = GetData(strConn, strProcedure, Index, winFormPager1.PageSize);
- //獲取並設定總記錄數
- winFormPager1.RecordCount = RecordCount;
- }
- /// <summary>
- /// 獲取資料來源
- /// </summary>
- /// <param name="conn"></param>
- /// <param name="strProcedure"></param>
- /// <param name="pageIndex"></param>
- /// <param name="pageSize"></param>
- /// <returns></returns>
- private DataTable GetData(string conn, string strProcedure, int pageIndex, int pageSize)
- {
- using (SqlConnection connection = new SqlConnection(conn))
- {
- SqlCommand command = new SqlCommand(strProcedure, connection);
- command.CommandType = CommandType.StoredProcedure;//採用儲存過程
- //儲存過程引數
- command.Parameters.Add("@Table", SqlDbType.NVarChar, 1000).Value = "DepartDemo";
- command.Parameters.Add("@TIndex", SqlDbType.NVarChar, 100).Value = "PKID";
- command.Parameters.Add("@Column", SqlDbType.NVarChar, 2000).Value = "*";
- command.Parameters.Add("@Sql", SqlDbType.NVarChar, 3000).Value = " 1=1 ";
- command.Parameters.Add("@PageIndex", SqlDbType.Int, 8).Value = pageIndex.ToString();
- command.Parameters.Add("@PageSize", SqlDbType.Int, 8).Value = pageSize.ToString();
- command.Parameters.Add("@Sort", SqlDbType.NVarChar, 200).Value = " PKID desc";
- //開啟連線
- if (connection.State != ConnectionState.Open) { connection.Open(); }
- try
- {
- //填充資料
- SqlDataAdapter da = new SqlDataAdapter(command);
- DataSet ds = new DataSet();
- da.Fill(ds);
- //獲取總記錄數
- RecordCount = Convert.ToInt32(ds.Tables[1].Rows[0][0]);
- //返回資料集
- return ds.Tables[0];
- }
- catch (SqlException err)
- {
- MessageBox.Show(err.Message);
- return null; ;
- }
- finally
- {
- connection.Close();
- }
- }
- }
- #endregion
- #region Events
- private void frmMain_Load(object sender, EventArgs e)
- {
- //不自動生成列
- dgvList.AutoGenerateColumns = false;
- //繫結資料
- BindDataWithPage(1);
- }
- /// <summary>
- /// 翻頁事件
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void winFormPager1_PageIndexChanged(object sender, EventArgs e)
- {
- BindDataWithPage(winFormPager1.PageIndex);
- }
- #endregion
- }
- }
下載控制元件原始碼及演示程式(含SQL)
邀月注:本文版權由邀月和CSDN共同所有,轉載請註明出處。助人等於自助! [email protected]