您的位置:首页 > 数据库

如何在WinForm中对DataGrid进行分页显示

2006-04-11 17:56 531 查看
在网上大多数对DataGrid进行分页的例子都是Asp.net环境下的,其实在WinForm中也很简单。以下就是简单举一个例子。
 
       首先,需要定义一个数据库存储过程,用来获得指定页的数据记录,大致的数据结构和存储过程如下(在SQL Server 2000下):

[align=center]字段名[/align]
[align=center]类型[/align]
[align=center]备注[/align]
EmployeeID
Int
自增字段,主键
EmployeeName
Varchar(20)
 
Salary
Int
 
CellPhone
Varchar(20)
 
EmailAddress
Varchar(20)
 
 
存储过程为:
CREATE PROCEDURE GetEmployees @EmployeeNum int, @StartNO int, @@TotalCount INT OUTPUT, @@RealNum INT OUTPUT AS
-- Get employees from DB through the specific number and the start position
DECLARE @PreRecCount VARCHAR( 10 )
DECLARE @CurRecCount VARCHAR( 10 )
 
SELECT @@TotalCount = COUNT(*) FROM EmployeeInfo
 
IF @@TotalCount > ( @StartNO + 1 ) * @EmployeeNum
    SET @@RealNum = @EmployeeNum
ELSE
    SET @@RealNum = @@TotalCount - @StartNO * @EmployeeNum
 
-- Get employees by the computed number
SET @CurRecCount = CAST( @StartNO * @EmployeeNum + @@RealNum AS VARCHAR( 10 ) )
IF @STARTNO = 0
   EXEC( 'SELECT TOP ' + @CurRecCount + ' * FROM EmployeeInfo ORDER BY EmployeeID ASC' )
ELSE
   BEGIN
         SET @PreRecCount = CAST( @StartNO * @EmployeeNum AS VARCHAR( 10 ) )
         EXEC( 'SELECT TOP ' + @CurRecCount + ' * FROM EmployeeInfo WHERE EmployeeID NOT IN '
                   + '(SELECT TOP ' + @PreRecCount + ' EmployeeID FROM EmployeeInfo ORDER BY EmployeeID ASC) '
                   + 'ORDER BY EmployeeID ASC'
                   )
   END
GO
 
然后就是调用存储过程来进行显示,比较完整的源代码如下:
[align=left]//------------------------ Multi Page Demo ------------------------------------[/align]
[align=left]//-----------------------------------------------------------------------------[/align]
//---File:frmMultiPagesDemo.cs
[align=left]//---Description:The main form file to show how to use pages in datagrid [/align]
[align=left]//---Author:Knight[/align]
[align=left]//---Date:Mar.23, 2006[/align]
[align=left]//-----------------------------------------------------------------------------[/align]
[align=left]//-----------------------{ Multi Page Demo }-----------------------------------[/align]
[align=left] [/align]
[align=left]using System;[/align]
[align=left]using System.Drawing;[/align]
[align=left]using System.Collections;[/align]
[align=left]using System.ComponentModel;[/align]
[align=left]using System.Windows.Forms;[/align]
[align=left]using System.Data;[/align]
[align=left]using System.Data.SqlClient;[/align]
[align=left] [/align]
[align=left]namespace CSDataGrid[/align]
[align=left]{[/align]
[align=left]    ///<summary>[/align]
[align=left]    /// Summary description for frmMultiPages.[/align]
[align=left]    ///</summary>[/align]
[align=left]    public class frmMultiPages : System.Windows.Forms.Form[/align]
[align=left]    {[/align]
[align=left]        private System.Windows.Forms.Label lblPageInfo;[/align]
[align=left]        private System.Windows.Forms.Button btnPrevious;[/align]
[align=left]        private System.Windows.Forms.Button btnNext;[/align]
[align=left] [/align]
[align=left]        protected SqlConnection sqlConn = new SqlConnection();[/align]
[align=left]        protected SqlDataAdapter sqlDAdapter = null;[/align]
[align=left]        protected DataSet sqlRecordSet = null;[/align]
[align=left] [/align]
[align=left]        private int nCurPageNum = 0;[/align]
[align=left]        private const int REC_NUM_PER_PAGE = 3;[/align]
[align=left]        private int nTotalCount;[/align]
[align=left]        private int nRealNum;[/align]
[align=left]        private int nTotalPage;[/align]
[align=left] [/align]
[align=left]        private System.Windows.Forms.DataGrid dtgUserInfo;[/align]
[align=left] [/align]
[align=left]        ///<summary>[/align]
[align=left]        /// Required designer variable.[/align]
[align=left]        ///</summary>[/align]
[align=left]        private System.ComponentModel.Container components = null;[/align]
[align=left] [/align]
[align=left]        public frmMultiPages()[/align]
[align=left]        {[/align]
[align=left]            //[/align]
[align=left]            // Required for Windows Form Designer support[/align]
[align=left]            //[/align]
[align=left]            InitializeComponent();[/align]
[align=left] [/align]
[align=left]            //[/align]
[align=left]            // TODO: Add any constructor code after InitializeComponent call[/align]
[align=left]            //[/align]
[align=left]        }[/align]
[align=left] [/align]
[align=left]        ///<summary>[/align]
[align=left]        /// Clean up any resources being used.[/align]
[align=left]        ///</summary>[/align]
[align=left]        protected override void Dispose( bool disposing )[/align]
[align=left]        {[/align]
[align=left]            if( disposing )[/align]
[align=left]            {[/align]
[align=left]                if(components != null)[/align]
[align=left]                {[/align]
[align=left]                    components.Dispose();[/align]
[align=left]                }[/align]
[align=left]            }[/align]
[align=left]            base.Dispose( disposing );[/align]
[align=left]        }[/align]
[align=left] [/align]
[align=left]        #region Windows Form Designer generated code[/align]
[align=left]        ///<summary>[/align]
[align=left]        /// Required method for Designer support - do not modify[/align]
[align=left]        /// the contents of this method with the code editor.[/align]
[align=left]        ///</summary>[/align]
[align=left]        private void InitializeComponent()[/align]
[align=left]        {[/align]
[align=left]            this.dtgUserInfo = new System.Windows.Forms.DataGrid();[/align]
[align=left]            this.lblPageInfo = new System.Windows.Forms.Label();[/align]
[align=left]            this.btnPrevious = new System.Windows.Forms.Button();[/align]
[align=left]            this.btnNext = new System.Windows.Forms.Button();[/align]
[align=left]            ((System.ComponentModel.ISupportInitialize)(this.dtgUserInfo)).BeginInit();[/align]
[align=left]            this.SuspendLayout();[/align]
[align=left]            // [/align]
[align=left]            // dtgUserInfo[/align]
[align=left]            // [/align]
[align=left]            this.dtgUserInfo.DataMember = "";[/align]
[align=left]            this.dtgUserInfo.HeaderForeColor = System.Drawing.SystemColors.ControlText;[/align]
[align=left]            this.dtgUserInfo.Location = new System.Drawing.Point(16, 16);[/align]
[align=left]            this.dtgUserInfo.Name = "dtgUserInfo";[/align]
[align=left]            this.dtgUserInfo.Size = new System.Drawing.Size(552, 416);[/align]
[align=left]            this.dtgUserInfo.TabIndex = 0;[/align]
[align=left]            // [/align]
[align=left]            // lblPageInfo[/align]
[align=left]            // [/align]
[align=left]            this.lblPageInfo.AutoSize = true;[/align]
[align=left]            this.lblPageInfo.Location = new System.Drawing.Point(16, 440);[/align]
[align=left]            this.lblPageInfo.Name = "lblPageInfo";[/align]
[align=left]            this.lblPageInfo.Size = new System.Drawing.Size(83, 16);[/align]
[align=left]            this.lblPageInfo.TabIndex = 1;[/align]
[align=left]            this.lblPageInfo.Text = "{0} of {1} Pages";[/align]
[align=left]            // [/align]
[align=left]            // btnPrevious[/align]
[align=left]            // [/align]
[align=left]            this.btnPrevious.Location = new System.Drawing.Point(408, 440);[/align]
[align=left]            this.btnPrevious.Name = "btnPrevious";[/align]
[align=left]            this.btnPrevious.TabIndex = 2;[/align]
[align=left]            this.btnPrevious.Text = "Previous";[/align]
[align=left]            this.btnPrevious.Click += new System.EventHandler(this.btnPrevious_Click);[/align]
[align=left]            // [/align]
[align=left]            // btnNext[/align]
[align=left]            // [/align]
[align=left]            this.btnNext.Location = new System.Drawing.Point(488, 440);[/align]
[align=left]            this.btnNext.Name = "btnNext";[/align]
[align=left]            this.btnNext.TabIndex = 3;[/align]
[align=left]            this.btnNext.Text = "Next";[/align]
[align=left]            this.btnNext.Click += new System.EventHandler(this.btnNext_Click);[/align]
[align=left]            // [/align]
[align=left]            // frmMultiPages[/align]
[align=left]            // [/align]
[align=left]            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);[/align]
[align=left]            this.ClientSize = new System.Drawing.Size(584, 469);[/align]
[align=left]            this.Controls.Add(this.btnNext);[/align]
[align=left]            this.Controls.Add(this.btnPrevious);[/align]
[align=left]            this.Controls.Add(this.lblPageInfo);[/align]
[align=left]            this.Controls.Add(this.dtgUserInfo);[/align]
[align=left]            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;[/align]
[align=left]            this.MaximizeBox = false;[/align]
[align=left]            this.Name = "frmMultiPages";[/align]
[align=left]            this.Text = "Multi Pages In DataGrid";[/align]
[align=left]            this.Load += new System.EventHandler(this.frmMultiPages_Load);[/align]
[align=left]            ((System.ComponentModel.ISupportInitialize)(this.dtgUserInfo)).EndInit();[/align]
[align=left]            this.ResumeLayout(false);[/align]
[align=left] [/align]
[align=left]        }[/align]
[align=left]        #endregion[/align]
[align=left] [/align]
[align=left]        private void frmMultiPages_Load(object sender, System.EventArgs e)[/align]
[align=left]        {[/align]
[align=left]            //Set connection string [/align]
[align=left]            sqlConn.ConnectionString = yourconnectionstring;[/align]
[align=left] [/align]
[align=left]            //Connect to DB[/align]
[align=left]            if( ConnectDB() )[/align]
[align=left]            {[/align]
[align=left]                //Bind data to datagrid[/align]
[align=left]                BindData();[/align]
[align=left]            }[/align]
[align=left]        [/align]
[align=left]        }[/align]
[align=left] [/align]
[align=left]        ///<summary>[/align]
[align=left]        /// Connect to DB[/align]
[align=left]        ///</summary>[/align]
[align=left]        ///<returns>If connected, return True; else return False</returns>[/align]
[align=left]        private bool ConnectDB()[/align]
[align=left]        {[/align]
[align=left]            //Check current connection's state[/align]
[align=left]            try[/align]
[align=left]            {[/align]
[align=left]                if(     sqlConn.State == ConnectionState.Closed[/align]
[align=left]                    || sqlConn.State == ConnectionState.Broken )[/align]
[align=left]                {[/align]
[align=left]                    //Connection is not available[/align]
[align=left]                    sqlConn.Close();[/align]
[align=left]                }[/align]
[align=left]                else[/align]
[align=left]                    //Connection is available[/align]
[align=left]                    return true;[/align]
[align=left]            }[/align]
[align=left]            catch{};[/align]
[align=left] [/align]
[align=left]            //Re-connect[/align]
[align=left]            try [/align]
[align=left]            {[/align]
[align=left]                sqlConn.Open();[/align]
[align=left]            }[/align]
[align=left]            catch(SqlException e) [/align]
[align=left]            {[/align]
[align=left]                //Sql's exception[/align]
[align=left]                MessageBox.Show( e.Message );[/align]
[align=left]            }[/align]
[align=left]            catch(Exception e)[/align]
[align=left]            {[/align]
[align=left]                //Other exception[/align]
[align=left]                MessageBox.Show( e.Message );[/align]
[align=left]            }[/align]
[align=left] [/align]
[align=left]            if(     sqlConn.State == ConnectionState.Closed[/align]
[align=left]                || sqlConn.State == ConnectionState.Broken )[/align]
[align=left]                //Connection is not available[/align]
[align=left]                return false;[/align]
[align=left]            else[/align]
[align=left]                //Connection is available[/align]
[align=left]                return true;[/align]
[align=left]        }[/align]
[align=left] [/align]
[align=left]        private void AddDGStyle()[/align]
[align=left]        {[/align]
[align=left]            DataGridTableStyle ts1 = new DataGridTableStyle(); [/align]
[align=left] [/align]
[align=left]            //specify the table from dataset (required step) [/align]
[align=left]            ts1.MappingName = "EmployeeInfo"; [/align]
[align=left]            PropertyDescriptorCollection pdc = this.BindingContext[/align]
[align=left]                [sqlRecordSet, "EmployeeInfo"].GetItemProperties();[/align]
[align=left] [/align]
[align=left]            DataGridColumnStyle TextCol = new DataGridTextBoxColumn( pdc["EmployeeID"], "i" );[/align]
[align=left]            TextCol.MappingName = "EmployeeID"; [/align]
[align=left]            TextCol.HeaderText = "EmployeeID"; [/align]
[align=left]            TextCol.Width = 0; [/align]
[align=left]            TextCol.ReadOnly = true;[/align]
[align=left]            ts1.GridColumnStyles.Add(TextCol); [/align]
[align=left] [/align]
[align=left]            TextCol = new DataGridTextBoxColumn(); [/align]
[align=left]            TextCol.MappingName = "EmployeeName"; [/align]
[align=left]            TextCol.HeaderText = "Employee Name"; [/align]
[align=left]            TextCol.Width = 100; [/align]
[align=left]            ts1.GridColumnStyles.Add(TextCol); [/align]
[align=left]            [/align]
[align=left]            TextCol = new DataGridTextBoxColumn( pdc["Salary"], "i" );[/align]
[align=left]            TextCol.MappingName = "Salary"; [/align]
[align=left]            TextCol.HeaderText = "Salary"; [/align]
[align=left]            TextCol.Width = 80; [/align]
[align=left]            ts1.GridColumnStyles.Add(TextCol); [/align]
[align=left]            [/align]
[align=left]            TextCol = new DataGridTextBoxColumn(); [/align]
[align=left]            TextCol.MappingName = "CellPhone"; [/align]
[align=left]            TextCol.HeaderText = "Cell Phone"; [/align]
[align=left]            TextCol.Width = 80; [/align]
[align=left]            ts1.GridColumnStyles.Add(TextCol); [/align]
[align=left] [/align]
[align=left]            TextCol = new DataGridTextBoxColumn(); [/align]
[align=left]            TextCol.MappingName = "EmailAddress"; [/align]
[align=left]            TextCol.HeaderText = "Email Address"; [/align]
[align=left]            TextCol.Width = 100; [/align]
[align=left]            ts1.GridColumnStyles.Add(TextCol); [/align]
[align=left] [/align]
[align=left]            dtgUserInfo.TableStyles.Add(ts1);[/align]
[align=left] [/align]
[align=left]        }[/align]
[align=left] [/align]
[align=left]        private void GetEmployeeData()[/align]
[align=left]        {[/align]
[align=left]            sqlDAdapter = new SqlDataAdapter( );[/align]
[align=left]            SqlCommand sqlComm = new SqlCommand();[/align]
[align=left]            sqlComm.Connection = sqlConn;[/align]
[align=left] [/align]
[align=left]            sqlComm.CommandText = "GetEmployees";[/align]
[align=left]            sqlComm.CommandType = CommandType.StoredProcedure;[/align]
[align=left]            sqlComm.Parameters.Add ( "@EmployeeNum", REC_NUM_PER_PAGE );[/align]
[align=left]            sqlComm.Parameters.Add ( "@StartNO", nCurPageNum );[/align]
[align=left]            SqlParameter sqlPar = sqlComm.Parameters.Add ( "@@TotalCount", SqlDbType.Int );[/align]
[align=left]            sqlPar.Direction = ParameterDirection.Output;[/align]
[align=left]            sqlPar = sqlComm.Parameters.Add ( "@@RealNum", SqlDbType.Int );[/align]
[align=left]            sqlPar.Direction = ParameterDirection.Output;[/align]
[align=left] [/align]
[align=left]            sqlDAdapter.SelectCommand = sqlComm;[/align]
[align=left] [/align]
[align=left]            //Fill dataset[/align]
[align=left]            sqlRecordSet = new DataSet();[/align]
[align=left]            sqlDAdapter.Fill( sqlRecordSet, "EmployeeInfo" );[/align]
[align=left]            nTotalCount = Convert.ToInt32( sqlComm.Parameters["@@TotalCount"].Value.ToString() );[/align]
[align=left]            nRealNum = Convert.ToInt32( sqlComm.Parameters["@@RealNum"].Value.ToString() );[/align]
[align=left]            [/align]
[align=left]            sqlComm.Dispose();[/align]
[align=left] [/align]
[align=left]            nTotalPage = nTotalCount - nTotalCount % REC_NUM_PER_PAGE;[/align]
[align=left]            nTotalPage /= REC_NUM_PER_PAGE;[/align]
[align=left]            nTotalPage++;[/align]
[align=left] [/align]
[align=left]            lblPageInfo.Text = string.Format( "{0} of {1} pages", nCurPageNum + 1, nTotalPage );[/align]
[align=left]            if( nCurPageNum + 1 >= nTotalPage )[/align]
[align=left]                btnNext.Enabled = false;[/align]
[align=left]            else[/align]
[align=left]                btnNext.Enabled = true;[/align]
[align=left] [/align]
[align=left]            if( nCurPageNum == 0 )[/align]
[align=left]                btnPrevious.Enabled = false;[/align]
[align=left]            else[/align]
[align=left]                btnPrevious.Enabled = true;[/align]
[align=left]                [/align]
[align=left]        }[/align]
[align=left] [/align]
[align=left]        private void BindData()[/align]
[align=left]        {[/align]
[align=left]            GetEmployeeData();[/align]
[align=left] [/align]
[align=left]            //Bind datagrid with dataset[/align]
[align=left]            dtgUserInfo.SetDataBinding( sqlRecordSet, "EmployeeInfo");[/align]
[align=left] [/align]
[align=left]            //Add datagrid style[/align]
[align=left]            AddDGStyle();[/align]
[align=left]        }[/align]
[align=left] [/align]
[align=left]        private void ReBindData()[/align]
[align=left]        {[/align]
[align=left]            GetEmployeeData();[/align]
[align=left] [/align]
[align=left]            //Bind datagrid with dataset[/align]
[align=left]            dtgUserInfo.SetDataBinding( sqlRecordSet, "EmployeeInfo");[/align]
[align=left]        }[/align]
[align=left] [/align]
[align=left]        private void btnPrevious_Click(object sender, System.EventArgs e)[/align]
[align=left]        {[/align]
[align=left]            nCurPageNum--;[/align]
[align=left]            sqlRecordSet.Tables["EmployeeInfo"].Rows.Clear();[/align]
[align=left]            ReBindData();[/align]
[align=left]        }[/align]
[align=left] [/align]
[align=left]        private void btnNext_Click(object sender, System.EventArgs e)[/align]
[align=left]        {[/align]
[align=left]            nCurPageNum++;[/align]
[align=left]            sqlRecordSet.Tables["EmployeeInfo"].Rows.Clear();[/align]
[align=left]            ReBindData();[/align]
[align=left]        }[/align]
[align=left] [/align]
[align=left]    }[/align]
[align=left]}[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息