在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分页控件,个人觉得只是满足了自己项目的需求,但是我想肯定还有不足的地方,或者编码不规范或者有更好的方法,
希望有经验的朋友能提出来,好让能改进改进,也可以从中学习下!~