English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In the past, I have been engaged in B/In the S development, due to the company having a large C/In the S project, when using DATAGRIDVIEW, a large amount of data is displayed, so pagination mode is used, and I don't know if this is correct.
I want to find a C/The pagination controls under S are not very good, so I followed B myself./Modify the pagination control under S to the one under WINFORM.
Firstly, create a user control named pager, drag bindingNavigator and bindingSource into the control, modify bindingNavigator, and add necessary controls.
The effect is as follows:
The code implementation is as follows:
namespace WindowsApp.MyControl { /**//// <summary> /// declare delegate /// </summary> /// <param name="e"></param> /// <returns></returns> public delegate int EventPagingHandler(EventPagingArg e); /**//// <summary> /// pagination control rendering /// </summary> public partial class Pager : UserControl { public Pager() { InitializeComponent(); } public event EventPagingHandler EventPaging; /**//// <summary> /// records per page /// </summary> private int _pageSize = 20; /**//// <summary> /// records per page /// </summary> public int PageSize { get { return _pageSize; } set { _pageSize = value; GetPageCount(); } } private int _nMax = 0; /**//// <summary> /// Total number of records /// </summary> public int NMax { get { return _nMax; } set { _nMax = value; GetPageCount(); } } private int _pageCount = 0; /**//// <summary> /// page number = total number of records/records per page /// </summary> public int PageCount { get { return _pageCount; } set { _pageCount = value; } } private int _pageCurrent = 0; /**//// <summary> /// current page number /// </summary> public int PageCurrent { get { return _pageCurrent; } set { _pageCurrent = value; } } private void GetPageCount() { if (this.NMax > 0) { this.PageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(this.NMax)) / Convert.ToDouble(this.PageSize))); } else { this.PageCount = 0; } } /**//// <summary> /// The method for binding data to the pagination control /// </summary> public void Bind() { if (this.EventPaging != null) { this.NMax = this.EventPaging(new EventPagingArg(this.PageCurrent)); } if (this.PageCurrent > this.PageCount) { this.PageCurrent = this.PageCount; } if (this.PageCount == 1) { this.PageCurrent = 1; } lblPageCount.Text = this.PageCount.ToString(); this.lblMaxPage.Text = "Total"+this.NMax.ToString()+"records"; this.txtCurrentPage.Text = this.PageCurrent.ToString(); if (this.PageCurrent == 1) { this.btnPrev.Enabled = false; this.btnFirst.Enabled = false; } else { btnPrev.Enabled = true; btnFirst.Enabled = true; } if (this.PageCurrent == this.PageCount) { this.btnLast.Enabled = false; this.btnNext.Enabled = false; } else { btnLast.Enabled = true; btnNext.Enabled = true; } if (this.NMax == 0) { btnNext.Enabled = false; btnLast.Enabled = false; btnFirst.Enabled = false; btnPrev.Enabled = false; } } private void btnFirst_Click(object sender, EventArgs e) { PageCurrent = 1; this.Bind(); } private void btnPrev_Click(object sender, EventArgs e) { PageCurrent -= 1; if (PageCurrent <= 0) { PageCurrent = 1; } this.Bind(); } private void btnNext_Click(object sender, EventArgs e) { this.PageCurrent += 1; if (PageCurrent > PageCount) { PageCurrent = PageCount; } this.Bind(); } private void btnLast_Click(object sender, EventArgs e) { PageCurrent = PageCount; this.Bind(); } private void btnGo_Click(object sender, EventArgs e) { if (this.txtCurrentPage.Text != null && txtCurrentPage.Text != ") { if (Int32.TryParse(txtCurrentPage.Text, out _pageCurrent)) { this.Bind(); } else { Common.MessageProcess.ShowError("Input number format error!"); } } } } /**//// <summary> /// Custom event data base class /// </summary> public class EventPagingArg : EventArgs { private int _intPageIndex; public EventPagingArg(int PageIndex) { _intPageIndex = PageIndex; } } }
Basic control function implementation.
How to bind data?
Large-scale pagination, use stored procedures.
This stored procedure is from the internet, hahaha. I'm posting it here, hoping the original author won't throw bricks at me.
ALTER PROCEDURE SP_Pagination /**//* *************************************************************** ** Massive pagination storage procedure ** *************************************************************** Parameter description: 1.Tables : Table name, view 2.PrimaryKey : Primary key 3.Sort : Sort statement, without Order By, for example: NewsID Desc,OrderRows Asc 4.CurrentPage : Current page number 5.PageSize : Page size 6.Filter : Filter statement, without Where 7.Group : Group statement, without Group By Effect demonstration: http://www.cn5135.com/_App/Enterprise/QueryResult.aspx ***************************************************************/ ( @Tables varchar(2000), @PrimaryKey varchar(500), @Sort varchar(500) = NULL, @CurrentPage int = 1, @PageSize int = 10, @Fields varchar(2000) = '*', @Filter varchar(1000) = NULL, @Group varchar(1000) = NULL ) AS /**//*Default sorting*/ IF @Sort IS NULL OR @Sort = '' SET @Sort = @PrimaryKey DECLARE @SortTable varchar(1000) DECLARE @SortName varchar(1000) DECLARE @strSortColumn varchar(1000) DECLARE @operator char(2) DECLARE @type varchar(1000) DECLARE @prec int /**//*Set the sorting statement.*/ IF CHARINDEX('DESC',@Sort)>0 BEGIN SET @strSortColumn = REPLACE(@Sort, 'DESC', '') SET @operator = '<=' END ELSE BEGIN IF CHARINDEX('ASC', @Sort) = 0 SET @strSortColumn = REPLACE(@Sort, 'ASC', '') SET @operator = '>=' END IF CHARINDEX('.', @strSortColumn) > 0 BEGIN SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn)) SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn)) END ELSE BEGIN SET @SortTable = @Tables SET @SortName = @strSortColumn END SELECT @type=t.name, @prec=c.prec FROM sysobjects o JOIN syscolumns c on o.id=c.id JOIN systypes t on c.xusertype=t.xusertype WHERE o.name = @SortTable AND c.name = @SortName IF CHARINDEX('char', @type) > 0 SET @type = @type + '(' + CAST(@prec AS varchar) + ')' DECLARE @strPageSize varchar(500) DECLARE @strStartRow varchar(500) DECLARE @strFilter varchar(1000) DECLARE @strSimpleFilter varchar(1000) DECLARE @strGroup varchar(1000) /**//*Default current page*/ IF @CurrentPage < 1 SET @CurrentPage = 1 /**//*Set pagination parameters.*/ SET @strPageSize = CAST(@PageSize AS varchar(500)) SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1) AS varchar(500)) /**//*Filtering and grouping statements.*/ IF @Filter IS NOT NULL AND @Filter != '' BEGIN SET @strFilter = ' WHERE ' + @Filter + ' ' SET @strSimpleFilter = ' AND ' + @Filter + ' ' END ELSE BEGIN SET @strSimpleFilter = '' SET @strFilter = '' END IF @Group IS NOT NULL AND @Group != '' SET @strGroup = ' GROUP BY ' + @Group + ' ' ELSE SET @strGroup = '' /**//*Execute the query statement*/ EXEC( ' DECLARE @SortColumn ' + @type + ' SET ROWCOUNT ' + @strStartRow + ' SELECT @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + ' SET ROWCOUNT ' + @strPageSize + ' SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + ' ' )
Using this stored procedure, get the data, bind the data to the data control, and provide a pageData class
/**//// <summary> /// Data source provider /// </summary> public class PageData { private int _PageSize = 10; private int _PageIndex = 1; private int _PageCount = 0; private int _TotalCount = 0; private string _TableName;//Table name private string _QueryFieldName = "*";//Table field FieldStr private string _OrderStr = string.Empty; //Sorting_SortStr private string _QueryCondition = string.Empty;//Query condition RowFilter private string _PrimaryKey = string.Empty;//Primary Key /**//// <summary> /// Number of displayed pages /// </summary> public int PageSize { get { return _PageSize; } set { _PageSize = value; } } /**//// <summary> /// Current page /// </summary> public int PageIndex { get { return _PageIndex; } set { _PageIndex = value; } } /**//// <summary> /// Total number of pages /// </summary> public int PageCount { get { return _PageCount; } } /**//// <summary> /// Total number of records /// </summary> public int TotalCount { get { return _TotalCount; } } /**//// <summary> /// Table name, including views /// </summary> public string TableName { get { return _TableName; } set { _TableName = value; } } /**//// <summary> /// Table field FieldStr /// </summary> public string QueryFieldName { get { return _QueryFieldName; } set { _QueryFieldName = value; } } /**//// <summary> /// Sorting field /// </summary> public string OrderStr { get { return _OrderStr; } set { _OrderStr = value; } } /**//// <summary> /// Query Condition /// </summary> public string QueryCondition { get { return _QueryCondition; } set { _QueryCondition = value; } } /**//// <summary> /// Primary Key /// </summary> public string PrimaryKey { get { return _PrimaryKey; } set { _PrimaryKey = value; } } public DataSet QueryDataTable() { SqlParameter[] parameters = { new SqlParameter("@Tables", SqlDbType.VarChar , 255), new SqlParameter("@PrimaryKey" , SqlDbType.VarChar , 255), new SqlParameter("@Sort", SqlDbType.VarChar , 255 ), new SqlParameter("@CurrentPage", SqlDbType.Int), new SqlParameter("@PageSize", SqlDbType.Int), new SqlParameter("@Fields", SqlDbType.VarChar , 255), new SqlParameter("@Filter", SqlDbType.VarChar ,1000), new SqlParameter("@Group", SqlDbType.VarChar , 1000 ) }; parameters[0].Value = _TableName; parameters[1].Value = _PrimaryKey; parameters[2].Value = _OrderStr; parameters[3].Value = PageIndex; parameters[4].Value = PageSize; parameters[5].Value = _QueryFieldName; parameters[6].Value = _QueryCondition; parameters[7].Value = string.Empty; DataSet ds = DbHelperSQL.RunProcedure("SP_Pagination", parameters, "dd"); _TotalCount = GetTotalCount(); if (_TotalCount == 0) { _PageIndex = 0; _PageCount = 0; } else { _PageCount = _TotalCount % _PageSize == 0 ? _TotalCount / _PageSize : _TotalCount / _PageSize + 1; if (_PageIndex > _PageCount) { _PageIndex = _PageCount; parameters[4].Value = _PageSize; ds = QueryDataTable(); } } return ds; } public int GetTotalCount() { string strSql = " select count("1) from "+_TableName; if (_QueryCondition != string.Empty) { strSql +=" where " + _QueryCondition; } return int.Parse(DbHelperSQL.GetSingle(strSql).ToString()); } }
Alright, put a DATAGRIDVIEW control on the page and drag in the pager
private void ReceiveOrderJLForm_Load(object sender, EventArgs e) { this.pager1.PageCurrent = 1; this.pager1.Bind(); } private int dgvBind() { WindowsApp.MyControl.PageData pageData = new WindowsApp.MyControl.PageData(); pageData.TableName = "T_ReceiveOrder"; pageData.PrimaryKey = "ReceiveOrderID"; pageData.OrderStr = "ReceiveOrderID desc"; pageData.PageIndex = this.pager;1.PageCurrent; pageData.PageSize = this.pager1.PageSize; pageData.QueryCondition = _strSql + strWhere.ToString(); pageData.QueryFieldName = "*"; this.pager1.bindingSource.DataSource = pageData.QueryDataTable().Tables[0]; this.pager1.bindingNavigator.BindingSource = pager1.bindingSource; dgvReceiveOrder.AutoGenerateColumns = false; dgvReceiveOrder.DataSource = this.pager1.bindingSource; return pageData.TotalCount; } private int pager1_EventPaging(WindowsApp.MyControl.EventPagingArg e) { return dgvBind(); }
The effect is as follows
Source Code Download:http://xiazai.jb51.net/201609/yuanma/winformPager(jb51.net).rar
That's all for this article. Hope it helps everyone's learning and also hope everyone will support the Yana Tutorial.
Statement: The content of this article is from the Internet, and the copyright belongs to the original author. The content is contributed and uploaded by Internet users spontaneously. This website does not own the copyright, has not been manually edited, and does not assume any relevant legal liability. If you find any content suspected of copyright infringement, please send an email to: notice#oldtoolbag.com (Please replace # with @ when sending an email to report abuse, and provide relevant evidence. Once verified, this site will immediately delete the infringing content.)