DataGirdView存储过程分页 For Winfrom

在Winfrom中,网格控件DataGridView并不像DataGrid自带分页功能,正好工作需要,写了下分页,只是满足项目要求。

存储过程:

CREATE  PROC pro_userDefined_DataGridPage

@TotalRecords   INT OUTPUT,   --记录总数

@TotalTableName VARCHAR(100), --查询记录总数的表名

@TotalJoinStr VARCHAR (1000), --查询记录总数连接语句

@TotalRecordsCondition VARCHAR(500),--查询记录总数的条件语句

@CurrentPage  INT = 1,        --当前页数

@PageSize     INT = 10,          --每页显示的行数

@TableName    VARCHAR (100),--表名,视图,存储过程

@FieldNames   VARCHAR (1000),--需要显示的字段名

@JoinStr      VARCHAR (1000),--连接语句(左连接,右连接,内连接,交叉连接)

@PrimaryField VARCHAR (100), --主键字段

@ConditionString VARCHAR (1000),--条件语句

@FilterString VARCHAR (1000),--过滤条件语句

@OrderField   VARCHAR (100) --根据字段排序

AS
DECLARE

@queryStr NVARCHAR(3000), --SQL查询语句

@FilterRecordCount INT   --过滤的记录数

IF @ConditionString = '' 
	SET  @ConditionString =' 1=1 '
IF @FilterString = ''
	SET @FilterString = ' 1=1 '
IF @TotalJoinStr = ''
	SET @TotalJoinStr = ''
BEGIN
	SET @queryStr = 'SELECT @TotalRecords = COUNT(' + @PrimaryField + '	)FROM ' + @TotalTableName + ' ' + @TotalJoinStr + ' WHERE ' +  @TotalRecordsCondition

	EXEC sp_executesql @queryStr,N'@TotalRecords int output',@TotalRecords output

	PRINT @TotalRecords
END

IF @CurrentPage = 1 --第一页
	BEGIN
		SET @queryStr = ' SELECT TOP ' + CAST(@PageSize AS VARCHAR(10)) + ' ' + @fieldNames + ' FROM ' + @TableName + ' ' + @JoinStr + 
		' WHERE ' +  @ConditionString + ' ORDER BY ' + @OrderField
		EXEC (@queryStr)
	END
ELSE
	BEGIN
		SET @CurrentPage = @CurrentPage - 1

		SET @FilterRecordCount = CAST(@CurrentPage * @PageSize AS VARCHAR(10))

		SET @queryStr =' SELECT TOP ' + CAST(@PageSize AS VARCHAR(10)) + ' ' + @fieldNames + ' FROM ' + @TableName + ' ' + @JoinStr + ' WHERE ' + @PrimaryField + 

			       ' NOT IN ( SELECT TOP ' + CAST(@FilterRecordCount AS VARCHAR(10)) + ' ' + @PrimaryField + ' FROM ' + @TableName + ' WHERE ' + @FilterString + ' ORDER BY ' + @PrimaryField + ') AND ' +  @ConditionString +

			       ' ORDER BY ' + @PrimaryField

		EXEC (@queryStr)	
	END
GO
 
用户控件:

导航菜单,我就用了ToolStrip控件进行创建各个按钮

代码实现:

声明变量,属性

 #region 变量

         private int _PageSum = 0; 

        private int _TotalRecords = 0;

        private int _CurrentPage = 1;

        private int _PageSize = 10;

        private string _TableName = null;

        private string _TotalTableName = null;

        private string _TotalJoinStr = null;

        private string _TotalRecordsCondition = null;

        private string _FieldNames = null;

        private string _JoinStr = null;

        private string _PrimaryField = null;

        private string _ConditionString = null;

        private string _FilterString = null;

        private string _OrderField = null;

        private DataTable _GridSource;

        private SqlParameter[] _SqlParameter;

        private SqlCommand     _SqlCommand;

        private SqlDataAdapter _SqlDataAdatpter;

        private DataSet   _girdDataSet;

        private DataTable _gridTable;

        private BindingSource _bingingSource = new BindingSource();

        private string _currentpageStr = "{0}";

        private string _pagesumStr = "共{0}条记录";

        #endregion



        #region 属性
          /// <summary>
         /// 设置当前页数
          /// </summary>
	public int SetCurrentPage
        {
            set { _CurrentPage = value; }
        }

        /// <summary>
        /// 设置每页显示的行数
         /// </summary>
        public int SetPageSize
        {
            set { _PageSize = value; }
        }

        /// <summary>
        /// 设置表名,视图,存储过程
         /// </summary>
        public string SetTableName
        {
            set { _TableName = value;}
        }
        /// <summary>
        /// 设置查询记录总数的表名
        /// </summary>
        public string SetTotalTableName
        {
            set { _TotalTableName = value; }
        }

        /// <summary>
        /// 设置查询总记录数连接语句(左连接,右连接,内连接,交叉连接)
        /// </summary>
        public string SetTotalJoinStr
        {
            set { _TotalJoinStr = value; }
        }

        /// <summary>
        /// 设置查询记录总数的条件语句
         /// </summary>
        public string SetTotalRecordsCondition   
        {
            set { _TotalRecordsCondition = value; }
        }

        /// <summary>
        /// 设置需要DataGirdView显示的字段,以逗号分开
         /// </summary>
        public string SetFieldNames
        {
            set { _FieldNames = value; }
        }

        /// <summary>
        /// 连接语句(左连接,右连接,内连接,交叉连接)
        /// </summary>
        public string SetJoinStr
        {
            set { _JoinStr = value; }
        }

        /// <summary>
        /// 设置主键字段
        /// </summary>
        public string SetPrimaryField
        {
            set { _PrimaryField = value; }
        }

        /// <summary>
        /// 设置查询条件语句
        /// </summary>
        public string SetConditionString
        {
            set { _ConditionString = value; }
        }

        /// <summary>
        /// 设置过滤查询条件语句
        /// </summary>
        public string SetFilterString
        {
            set { _FilterString = value; }
        }

        /// <summary>
        /// 设置排序字段
         /// </summary>
        public string SetOrderField
        {
            set { _OrderField = value; }
        }

        /// <summary>
        /// 获得DataGridView数据源
         /// </summary>
        public DataTable GetGridSource
        {
            get { return _gridTable; }
        }

        public BindingSource GetBingingSource
        {
            get { return _bingingSource; }
        }
 
toolStrip点击事件ItemClick
        #endregion
        /// <summary>
        /// 导航条点击事件
         /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void strNavigationBar_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            int m_currentPage = Convert.ToInt32(txtCurrentPage.Text);

            int m_pageNumber = 1;//转到页数

              int m_pageSize = 10;//设置显示行数

              bool m_isValid = false;//输入的行数和页数是否合法

              if (dataGridView.DataSource == null)
            {
                return;
            }

            try
            {
                if (e.ClickedItem.Text == "上一页")
                {
                    m_currentPage--;

                    if (m_currentPage <= 0)
                    {

                        MessageBox.Show("已经是第一页,请点击‘下一页’查看!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }
                    else
                    {
                        SetCurrentPage = m_currentPage;

                        PreviousPage(_CurrentPage);

                        txtCurrentPage.Text = m_currentPage.ToString();
                    }
                }

                if (e.ClickedItem.Text == "下一页")
                {
                    m_currentPage++;

                    if (m_currentPage > _PageSum)
                    {
                        MessageBox.Show("已经是最后页,请点击‘上一页’查看!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }
                    else
                    {
                        SetCurrentPage = m_currentPage;

                        NextPage(_CurrentPage);

                        txtCurrentPage.Text = m_currentPage.ToString();
                    }
                }

                if (e.ClickedItem.Text == "首页")
                {
                    SetCurrentPage = 1;

                    FirstPage(_CurrentPage);

                    txtCurrentPage.Text = "1";
                }

                if (e.ClickedItem.Text == "尾页")
                {
                    SetCurrentPage = _PageSum;

                    FirstPage(_CurrentPage);

                    txtCurrentPage.Text = _PageSum.ToString();
                }

                if (e.ClickedItem.Text == "Go")
                {
                    m_isValid = isValidContent(txtGotoPageNumber.Text.Trim());

                    if (!m_isValid)
                    {
                        MessageBox.Show("输入有效的页码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        txtGotoPageNumber.Focus();

                        return;
                    }

                    if (_TotalRecords > 0)
                    {
                        m_pageNumber = Convert.ToInt32(txtGotoPageNumber.Text.Trim());

                        if (m_pageNumber < 0 || m_pageNumber > _PageSum)
                        {
                            MessageBox.Show("输入有效的页码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                            txtGotoPageNumber.Focus();

                            return;
                        }

                        GotoPageNumber(m_pageNumber);

                        txtCurrentPage.Text = m_pageNumber.ToString();
                    }
                }
                if (e.ClickedItem.Text == "确定")
                {

                    m_isValid = isValidContent(txtPageSize.Text.Trim());

                    if (!m_isValid)
                    {
                        MessageBox.Show("输入有效的行数!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        txtPageSize.Focus();

                        return;
                    }

                    m_pageSize = Convert.ToInt32(txtPageSize.Text.Trim());

                    if (m_pageNumber < 0)
                    {
                        MessageBox.Show("输入有效的行数!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        txtPageSize.Focus();

                        return;
                    }
                    SetPageSize = m_pageSize;

                    InitDataGrid();
                }

                if (e.ClickedItem.Name == "btnHideNavigation")
                {
                    btnShowHideNavigation.Visible = true;

                    strNavigationBar.Visible = false;
                }
            }
            catch (Exception CommonException)
            {
                MessageBox.Show("窗口加载出错!" + CommonException.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        } 
 
按钮事件
 
        /// <summary>
        /// 首页
         /// </summary>
       /// <param name="CurrentPage"></param>
        private void FirstPage(int CurrentPage)
        {
            try
            {
                SetCurrentPage = CurrentPage;
                InitDataGrid();
            }
            catch (Exception CommonException)
            {
                throw new Exception(CommonException.Message);
            }
        }

        /// <summary>
        /// 尾页
         /// </summary>
        /// <param name="CurrentPage"></param>
        private void LastPage(int CurrentPage)
        {
            try
            {
                SetCurrentPage = CurrentPage;
                InitDataGrid();
            }
            catch (Exception CommonException)
            {
                throw new Exception(CommonException.Message);
            }
        }

        /// <summary>
        /// 下一页
         /// </summary>
        /// <param name="CurrentPage"></param>
        private void NextPage(int CurrentPage)
        {
            try
            {
                SetCurrentPage = CurrentPage;
                InitDataGrid();
            }
            catch (Exception CommonException)
            {
               throw new Exception(CommonException.Message);
            }
        }

        /// <summary>
        /// 上一页
         /// </summary>
        /// <param name="CurrentPage"></param>
        private void PreviousPage(int CurrentPage)
        {
            try
            {
                SetCurrentPage = CurrentPage;
                InitDataGrid();
            }
            catch (Exception CommonException)
            {
                throw new Exception(CommonException.Message);
            }
        }

        /// <summary>
        /// 转页
         /// </summary>
        /// <param name="pageNumber"></param>
        private void GotoPageNumber(int pageNumber)
        {
            try
            {
                SetCurrentPage = pageNumber;
                InitDataGrid();
            }
            catch (Exception CommonException)
            {
                throw new Exception(CommonException.Message);
            }
        } 
 
对输入的页数等信息进行验证
 
        /// <summary>    
        /// 验证是否是有效的内容  
        /// </summary>
        /// <param name="content"></param>
        /// <returns></returns>
        private bool isValidContent(string content)
        {
            bool m_isValid = true;

            for (int index = 0; index < content.Trim().Length; index++)
            {
                if (!Char.IsNumber(content.Trim(), index))
                {
                    m_isValid = false;
                }
            }
            return m_isValid;
        }
 
初始化DataGridView方法
 
        /// <summary>
        /// 初始化DataGirdView
        /// </summary>
        public void InitDataGrid()
        {
            _SqlDataAdatpter = new SqlDataAdapter();

            _SqlCommand = new SqlCommand();

            _girdDataSet = new DataSet();

            _SqlParameter = new SqlParameter[13];

            try
            {
                _SqlParameter[0] = new SqlParameter();

                _SqlParameter[0].ParameterName = "@TotalRecords";

                _SqlParameter[0].Size = 4;

                _SqlParameter[0].Direction = ParameterDirection.Output;

                _SqlParameter[1] = new SqlParameter();

                _SqlParameter[1].ParameterName = "@CurrentPage";

                _SqlParameter[1].Size = 4;

                _SqlParameter[1].Value = _CurrentPage;

                _SqlParameter[1].Direction = ParameterDirection.Input;

                _SqlParameter[2] = new SqlParameter();

                _SqlParameter[2].ParameterName = "@PageSize";

                _SqlParameter[2].Size = 4;

                _SqlParameter[2].Value = _PageSize;

                _SqlParameter[2].Direction = ParameterDirection.Input;

                _SqlParameter[3] = new SqlParameter();

                _SqlParameter[3].ParameterName = "@TableName";

                _SqlParameter[3].Size = 100;

                _SqlParameter[3].Value = _TableName;

                _SqlParameter[3].Direction = ParameterDirection.Input;

                _SqlParameter[4] = new SqlParameter();

                _SqlParameter[4].ParameterName = "@TotalTableName";

                _SqlParameter[4].Size = 100;

                _SqlParameter[4].Value = _TotalTableName;

                _SqlParameter[4].Direction = ParameterDirection.Input;

                _SqlParameter[5] = new SqlParameter();

                _SqlParameter[5].ParameterName = "@TotalJoinStr";

                _SqlParameter[5].Size = 1000;

                _SqlParameter[5].Value =_TotalJoinStr;

                _SqlParameter[5].Direction = ParameterDirection.Input;

                _SqlParameter[6] = new SqlParameter();

                _SqlParameter[6].ParameterName = "@TotalRecordsCondition";

                _SqlParameter[6].Size = 500;

                _SqlParameter[6].Value = _TotalRecordsCondition;

                _SqlParameter[6].Direction = ParameterDirection.Input;

                _SqlParameter[7] = new SqlParameter();

                _SqlParameter[7].ParameterName = "@FieldNames";

                _SqlParameter[7].Size = 1000;

                _SqlParameter[7].Value = _FieldNames;

                _SqlParameter[7].Direction = ParameterDirection.Input;

                _SqlParameter[8] = new SqlParameter();

                _SqlParameter[8].ParameterName = "@JoinStr";

                _SqlParameter[8].Size = 1000;

                _SqlParameter[8].Value = _JoinStr;

                _SqlParameter[8].Direction = ParameterDirection.Input;

                _SqlParameter[9] = new SqlParameter();

                _SqlParameter[9].ParameterName = "@PrimaryField";

                _SqlParameter[9].Size = 100;

                _SqlParameter[9].Value = _PrimaryField;

                _SqlParameter[9].Direction = ParameterDirection.Input;

                _SqlParameter[10] = new SqlParameter();

                _SqlParameter[10].ParameterName = "@ConditionString";

                _SqlParameter[10].Size = 1000;

                _SqlParameter[10].Value = _ConditionString;

                _SqlParameter[10].Direction = ParameterDirection.Input;

                _SqlParameter[11] = new SqlParameter();

                _SqlParameter[11].ParameterName = "@FilterString";

                _SqlParameter[11].Size = 1000;

                _SqlParameter[11].Value = _FilterString;

                _SqlParameter[11].Direction = ParameterDirection.Input;

                _SqlParameter[12] = new SqlParameter();

                _SqlParameter[12].ParameterName = "@OrderField";

                _SqlParameter[12].Size = 100;

                _SqlParameter[12].Value = _OrderField;

                _SqlParameter[12].Direction = ParameterDirection.Input;

                _girdDataSet = DBOperation.RunProcedure("pro_userDefined_DataGridPage", _SqlParameter, "gridtable");

                _gridTable = _girdDataSet.Tables["gridtable"];

                _bingingSource.DataSource = _gridTable;

                dataGridView.AutoGenerateColumns = false;

                dataGridView.EditMode = DataGridViewEditMode.EditOnEnter;

                dataGridView.DataSource = _bingingSource;

                _GridSource = _gridTable;


                //初始化状态栏
                   _TotalRecords = Convert.ToInt32(_SqlParameter[0].Value);

                lblTotalRecords.Text = string.Format(_pagesumStr, new object[] { _TotalRecords });//记录总数

                   _PageSum = _TotalRecords - _TotalRecords % _PageSize;

                _PageSum /= _PageSize;

                _PageSum++;

                lblPageCount.Text = string.Format(_currentpageStr, new object[] { _PageSum });//页数
              }
            catch (Exception CommonException)
            {
                MessageBox.Show("窗口加载出错!" + CommonException.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);            
            }
        } 
 
执行存储过程方法
 
         /// <summary>
        /// 执行存储过程
         /// </summary>
        /// <param name="storedProcName">存储过程名</param>
        /// <param name="parameters">存储过程参数</param>
        /// <param name="tableName">DataSet结果中的表名</param>
        /// <returns>DataSet</returns>
        public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
        {
            using (SqlConnection connection = dbconn.getDBConnection())
            {
                DataSet dataSet = new DataSet();
 
                connection.Open();

                SqlDataAdapter sqlDA = new SqlDataAdapter();

                sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);

                sqlDA.Fill(dataSet, tableName);

                connection.Close();

                return dataSet;
            }
        }
这样用户控件完成了,但如何调用呢? 
首先需要给参数赋值,其次,需要给DataGridView创建列 
参数赋值 
        /// <summary>
        /// 设置DataGridView参数
         /// </summary>
        private void SetDataGridParameters()
        {
            dataGridViewControl.SetTableName = " sys_User ";

            dataGridViewControl.SetTotalTableName = " sys_User ";

            dataGridViewControl.SetTotalJoinStr = " LEFT JOIN sys_Awards ON sys_User.EmployeeNo = sys_Awards.UserID collate Chinese_PRC_CI_AI_WS ";

            dataGridViewControl.SetTotalRecordsCondition = " sys_User.isVaild = 1 AND sys_Awards.Annual = '" + OverallYear + "'";            

            dataGridViewControl.SetFieldNames = " sys_User.[ID],sys_User.EmployeeNo,sys_User.UserName,sys_Duty.DutyName,sys_Dept.DeptName,sys_Awards.EndofYearAward,sys_Awards.HolidayAward ";

            dataGridViewControl.SetJoinStr = " LEFT JOIN sys_Awards ON  sys_Awards.UserID = sys_User.EmployeeNo collate Chinese_PRC_CI_AI_WS"

                                                         + " LEFT JOIN sys_Duty ON sys_User.Duty = sys_Duty.[ID]"

                                                         + " LEFT JOIN sys_EmployeeDeploy ON sys_User.EmployeeNo = sys_EmployeeDeploy.UserID"

                                                         + " LEFT JOIN sys_Dept ON sys_EmployeeDeploy.CurrentDept = sys_Dept.[ID] ";

            dataGridViewControl.SetPrimaryField = " sys_User.[ID] ";

            dataGridViewControl.SetConditionString = " sys_EmployeeDeploy.IsValid = 1 AND sys_User.isVaild = 1 AND sys_Awards.Annual = '" + OverallYear + "'";

            dataGridViewControl.SetFilterString = "  sys_User.isVaild = 1 ";

            dataGridViewControl.SetOrderField = " sys_User.[ID] ";
        } 
创建DataGridView列 
        /// <summary>
        /// 创建加列
         /// </summary>
        private void CreateGridColumns()
        {
            DataGridViewCell cell = new DataGridViewTextBoxCell();

            DataGridViewColumn[] columns = new DataGridViewColumn[7];

            columns[0] = new DataGridViewColumn();

            columns[0].Name = "ID";

            columns[0].HeaderText = "ID";

            columns[0].DataPropertyName = "ID";

            columns[0].CellTemplate = cell;

            columns[0].ReadOnly = true;

            columns[0].Visible = false;

            columns[1] = new DataGridViewColumn();

            columns[1].Name = "EmployeeNo";

            columns[1].HeaderText = "员工编号";

            columns[1].DataPropertyName = "EmployeeNo";

            columns[1].CellTemplate = cell;

            columns[1].ReadOnly = true;

            columns[1].Visible = true;

            columns[2] = new DataGridViewColumn();

            columns[2].Name = "UserName";

            columns[2].HeaderText = "员工姓名";

            columns[2].DataPropertyName = "UserName";

            columns[2].CellTemplate = cell;

            columns[2].ReadOnly = true;

            columns[2].Visible = true;

            columns[3] = new DataGridViewColumn();

            columns[3].Name = "DutyName";

            columns[3].HeaderText = "职位";

            columns[3].DataPropertyName = "DutyName";

            columns[3].CellTemplate = cell;

            columns[3].ReadOnly = true;

            columns[3].Visible = true;

            columns[4] = new DataGridViewColumn();

            columns[4].Name = "DeptName";

            columns[4].HeaderText = "部门";

            columns[4].DataPropertyName = "DeptName";

            columns[4].CellTemplate = cell;

            columns[4].ReadOnly = true;

            columns[4].Visible = true;

            columns[5] = new DataGridViewColumn();

            columns[5].Name = "EndofYearAward";

            columns[5].HeaderText = "年终奖";

            columns[5].DataPropertyName = "EndofYearAward";

            columns[5].CellTemplate = cell;

            columns[5].DefaultCellStyle.Format = "F";

            columns[5].ReadOnly = false;

            columns[5].Visible = true;

            columns[6] = new DataGridViewColumn();

            columns[6].Name = "HolidayAward";

            columns[6].HeaderText = "假日奖";

            columns[6].DataPropertyName = "HolidayAward";

            columns[6].CellTemplate = cell;

            columns[6].DefaultCellStyle.Format = "F";

            columns[6].ReadOnly = false;

            columns[6].Visible = true;

            foreach (DataGridViewColumn column in columns)
            {
                dataGridViewControl.dataGridView.Columns.Add(column);
            }
        } 
 
当然了,这2个方法都是在页面Load的时候调用的 
写到这结束了,这个DataGridView分页控件,个人觉得只是满足了自己项目的需求,但是我想肯定还有不足的地方,或者编码不规范或者有更好的方法,
希望有经验的朋友能提出来,好让能改进改进,也可以从中学习下!~
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值